50 lines
1.4 KiB
Racket
50 lines
1.4 KiB
Racket
|
#lang racket
|
||
|
|
||
|
(define input (for/list ([str (string-trim (file->string "input.8.txt"))])
|
||
|
(string->number (string str))))
|
||
|
|
||
|
(define width 25)
|
||
|
(define height 6)
|
||
|
(define pixels-per-layer (* width height))
|
||
|
|
||
|
(define (make-chunks lst n)
|
||
|
(cond [(empty? lst) '()]
|
||
|
[else (cons (take lst n) (make-chunks (drop lst n) n))]))
|
||
|
|
||
|
(define layers (make-chunks input pixels-per-layer))
|
||
|
|
||
|
(define (count-occur lst what)
|
||
|
(length (filter ((curry =) what) lst)))
|
||
|
|
||
|
(define (lowest-zeroes chunks)
|
||
|
(cond [(empty? (rest chunks)) (first chunks)]
|
||
|
[else
|
||
|
(let ([this (first chunks)]
|
||
|
[next (lowest-zeroes (rest chunks))])
|
||
|
(if (< (count-occur this 0) (count-occur next 0))
|
||
|
this
|
||
|
next))]))
|
||
|
|
||
|
(define lowest-zero-layer (lowest-zeroes layers))
|
||
|
|
||
|
;; Part 1
|
||
|
(* (count-occur lowest-zero-layer 1) (count-occur lowest-zero-layer 2))
|
||
|
|
||
|
(require 2htdp/image)
|
||
|
|
||
|
(define pixel-size 16)
|
||
|
(define colors '(black white transparent))
|
||
|
|
||
|
(define (render-pixel code)
|
||
|
(rectangle pixel-size pixel-size 'solid (list-ref colors code)))
|
||
|
|
||
|
(define (render-layer layer)
|
||
|
(define (render-row row)
|
||
|
(apply beside (map render-pixel row)))
|
||
|
(apply above (map render-row (make-chunks layer width))))
|
||
|
|
||
|
(define base (empty-scene (* pixel-size width) (* pixel-size height)))
|
||
|
(define decoded-image
|
||
|
(foldr overlay base (map render-layer layers)))
|
||
|
;; Part 2
|
||
|
(frame decoded-image)
|