advent-of-code/2019/day24/day24.rkt
2024-11-12 21:46:18 +01:00

66 lines
1.8 KiB
Racket

#lang racket
(module+ test
(require rackunit))
(define (read-input filename)
(for/set ([line (file->lines filename)]
[i (in-naturals)]
#:when #t
[c (in-string line)]
[j (in-naturals)]
#:when (eq? c #\#))
(make-rectangular j i)))
(define (grid-size grid)
(define indices (flatten (map (λ (x) (list (real-part x) (imag-part x))) (set->list grid))))
(add1 (apply max indices)))
(define (display-grid grid)
(define size (grid-size grid))
(for ([j (in-range size)])
(for ([i (in-range size)])
(if (set-member? grid (make-rectangular i j))
(printf "#")
(printf ".")))
(printf "~n")))
(define (count-neighbours grid pos)
(for/sum ([step '(-i -1 +i 1)]
#:when (set-member? grid (+ pos step)))
1))
(define (lives? grid pos)
(define n (count-neighbours grid pos))
(define alive (set-member? grid pos))
(cond
[(and alive (not (= 1 n))) #f]
[(and (not alive) (or (= 1 n) (= 2 n))) #t]
[else alive]))
(define (step grid)
(define size (grid-size grid))
(for*/set ([i (in-range size)]
[j (in-range size)]
#:when (lives? grid (make-rectangular i j)))
(make-rectangular i j)))
(define (biodiversity-rating grid)
(define size (grid-size grid))
(for*/sum ([i (in-range size)]
[j (in-range size)]
#:when (set-member? grid (make-rectangular i j)))
(expt 2 (+ i (* j size)))))
(define (part1 filename)
(define grid (read-input filename))
(define final
(car (for/fold ([grids (list grid)])
([i (in-naturals)]
#:break (member (car grids) (cdr grids)))
(cons (step (car grids)) grids))))
(biodiversity-rating final))
(module+ test
(check-equal? (part1 "test") 2129920)
(check-equal? (part1 "input") 32573535))