68 lines
1.9 KiB
Racket
68 lines
1.9 KiB
Racket
#lang curly-fn racket
|
|
|
|
(require "scripts/aoc.rkt")
|
|
|
|
;; solution for day 24
|
|
|
|
(define *dirs* (hash 'e 1-1i 'ne 1 'nw +1i 'w -1+1i 'sw -1 'se -1i))
|
|
(define *dirs-values* (hash-values *dirs*))
|
|
|
|
(define (paths->tiles input)
|
|
;; white is #f
|
|
;; black is #t
|
|
(define tiles (make-hash))
|
|
(for ([path (in-list input)])
|
|
(define posn
|
|
(for/fold ([posn 0]) ([p (in-list path)])
|
|
(+ posn (hash-ref *dirs* p))))
|
|
(hash-update! tiles posn not #f))
|
|
tiles)
|
|
|
|
(define (count-black tiles)
|
|
(for/sum ([(_ v) (in-hash tiles)] #:when v) 1))
|
|
|
|
(define (part1 input)
|
|
(count-black (paths->tiles input)))
|
|
|
|
(define (part2 input)
|
|
(define tiles (paths->tiles input))
|
|
|
|
(define (step tiles radius)
|
|
(define new-tiles (hash-copy tiles))
|
|
(for* ([x (in-range (- radius) (add1 radius))] [y (in-range (- radius) (add1 radius))])
|
|
(define thispos (make-rectangular x y))
|
|
(define thistile (hash-ref tiles thispos #f))
|
|
(define num-blacks
|
|
(for/sum ([neigh (in-list *dirs-values*)] #:when (hash-ref tiles (+ thispos neigh) #f))
|
|
1))
|
|
(hash-set! new-tiles thispos
|
|
(match* (thistile num-blacks)
|
|
[(#t (or 0 (not (or 1 2)))) #f]
|
|
[(#t _) #t]
|
|
[(#f 2) #t]
|
|
[(#f _) #f])))
|
|
new-tiles)
|
|
|
|
(define radius (apply max (map #{max (abs (real-part %)) (abs (imag-part %))}
|
|
(hash-keys tiles))))
|
|
(count-black
|
|
(for/fold ([tiles tiles]) ([i (in-range 100)] [radius (in-range (add1 radius) +inf.0)])
|
|
(step tiles radius))))
|
|
|
|
;; parse input file
|
|
(define (parse fname)
|
|
(for/list ([line (in-list (file->lines fname))])
|
|
(map string->symbol (regexp-match* #px"(e|se|sw|w|nw|ne)" line))))
|
|
|
|
|
|
(module+ test
|
|
(require rackunit)
|
|
;; tests here
|
|
(displayln "no tests :("))
|
|
|
|
(module+ main
|
|
(define input (parse "inputs/24"))
|
|
(answer 24 1 (time (part1 input)))
|
|
(answer 24 2 (time (part2 input)))
|
|
(displayln "meow"))
|