diff --git a/2020/11.rkt b/2020/11.rkt new file mode 100644 index 0000000..29ff1da --- /dev/null +++ b/2020/11.rkt @@ -0,0 +1,43 @@ +#lang br +(require racket/file rackunit) + +(define grid + (for*/hasheqv ([(row ridx) (in-indexed (file->lines "11.rktd"))] + [(col cidx) (in-indexed row)]) + (values (make-rectangular cidx ridx) col))) + +(define (seat-count grid) + (count (λ (val) (char=? val #\#)) (hash-values grid))) + +(define offsets '(-1-1i -1 -1+i +i 1+i 1 1-i -i)) + +(define (visible-occupied-seats grid k [adjacent-only? #false]) + (for/sum ([offset (in-list offsets)]) + (let loop ([k (+ k offset)] [sum 0]) + (match (hash-ref grid k #false) + [#false sum] + [#\# 1] + [#\L 0] + [_ (if adjacent-only? + sum + (loop (+ k offset) sum))])))) + +(define (adjacent-occupied-seats grid k) (visible-occupied-seats grid k #true)) + +(define (iterate grid seat-counter threshold) + (for/hasheqv ([(k v) (in-hash grid)]) + (match v + [#\L #:when (zero? (seat-counter grid k)) (values k #\#)] + [#\# #:when (<= threshold (seat-counter grid k)) (values k #\L)] + [_ (values k v)]))) + +(define (solve grid iteration-proc) + (let loop ([grid grid]) + (define next-grid (iteration-proc grid)) + (if (eqv? (seat-count grid) (seat-count next-grid)) + (seat-count grid) + (solve next-grid iteration-proc)))) + +(check-equal? (solve grid (λ (grid) (iterate grid adjacent-occupied-seats 4))) 2489) + +(check-equal? (solve grid (λ (grid) (iterate grid visible-occupied-seats 5))) 2180) \ No newline at end of file diff --git a/2020/11.rktd b/2020/11.rktd new file mode 100644 index 0000000..f5686ee --- /dev/null +++ b/2020/11.rktd @@ -0,0 +1,97 @@ +LLLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LLLLL.L.LLLLLLL.LLLLLLLLLLLLLL.LLL.L.L.LLLLLLLLL.LLLLL +LLLLLL.LLLLLL.LLLLLLLLLLLLLLL.LLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLL..LLLLL +LLLLLLLLLLLLL.L.LLL.LLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLL.LLLLL.LLLLL.LLLLL +LLLLLL.LLLLLLLLLLLL.LLLLLLLL.L.LLLL.LLLLLLLLLLLLL.LLLL.LLLLL.LL.LLLLL.LLLLLLLLLL.LLLLL.LLLLLL.LLLL +LLLLLL...LLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLL.LLLLL +LLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLL.L.LLL +LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLL..LLLL.LLLL.LLLLL.LLLLLLLL.LLLLLL.LLL.LLLLLLLLLLLLLLLLL +LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLL..LLLL.LLLLL.LLLLL.L.LLLLLLLLL +LLLLL..LLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLL.LLLLLLLLL.L.LLLLL.LLLLL +LLLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLL.LLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLL...LLLLL.LLLLLLLLLLL +...L...L....LL...LL.........L...LL.L...LLLL......LLLLLL.L.L.....L....L.LL.L.L.L.L...L.L..L.....L.. +LLLLLL.LLLLLL.LLLLL.LLLLLLLL.LL.LLL.LLLLLLLLLLLLL.LL.L.LLLLLLLLLLLLLL.LL.LLLLL.LLLLLLLLLLLLLLLLLLL +LLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLL.LLL.L.LLLL..LLLL.LLLLL.LLLLLLL.LLLLLLLLLLL.LLLLL.LLLLL +LLLL.LLLLLL.L.LLLLL.LLLLLLLLLLLLLLL.L.LLLLL.LLLLL.L.LL.LLLLL.LLLLLLLL.LLLLLLLLLL.LLLLL.LLLLL.LLLLL +LLLLLL.LLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLL.LLLLL.LLLLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLL.L.LLLLLLLLLLL.LLLLL.LLL +LLLLLLLLLLLLL.LLLL..LLLLLLLL.LLLLLLLLLLLLLL.LLLLL.LLLL.LLLLL.LLLLLLLL.LLLL.LLLL.LLLLLL.LLLLL.LLLLL +LLLLLLLLLLLLL.LLLLL..LLLLLL..LLLLLL.LLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +......L...LL.....LL..L.L...L...L..L.L.L.....L.LL..LLL.....L........L..........LL.........LLLL..... +LL.LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLL.LLLLLLL.LLLLL.LLLL.LLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLL +.L.LLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LLLLL.LLLL.LLLLL.LL.LLLLLLLLLL.LLL.LLLLLLLLLLLLL.LLLLL +LLLLLL..LLLLLLLLLLL.LLLLLLLL..LLLLLLL.LLLLL.LLLLLL.LLLLLLL.L.LLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLL.LLLL +LLLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLL.LLLLL..LLL.LLLLL.LLLLLLLL.LLLL.LLLLL.LLLLL.LLLLLLLLLLL +.L....L....L.L.LLLLL..L....L......L....LL.LLL.L.LL....LL..........L....L.L...LLLL.L..LLL.LL.L..... +LLLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLL..LL.LLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LL.LL.LLLLL +LL.LLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLL..LLLL.LLLLL.LL.LLLLL.LL.LLLLLLL.LLLLL.LLL.LLLLLLL +LLL.LLLLLLLLL.LLLLL.LLLLLLLL.LLLLLL.LL.L.LLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLL.L.LLLLL.LLLLLLLLLLL +LLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLL..LLLLLLLLLLLLLL..LLL.LLLLL.LLLLLLLLLLL.LLLLL +...L.....LL.L..LL..L.LLL..LL...L.LL..L....LL.....L.L.L.LL....L.L.L.......L....L.....L........LLL.. +LLLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLL +LLLLLL.LL.LLLLL.L.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLL.L.LLLLLL.LL.LLLLL +LLLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLL..LLLLL.LLLL.L.LLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLLLLL.L.LLL +LLLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLL.LLL.LL.LLL.LLLLL..LLLLLLL.LLLL.LLLLL.LLLLLLLLLL..LLLLL +LLLLLL.LLLLLL..LLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLL.LLLL.LLLLL.L.LLLLLL.LLLLLLLLLL.LLLLL.LLLLL.LLL.L +LLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLL.LLLLLLLL.LLLL.LLLLL.LLLLL.LLLLLLLLLLL +LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLL.LL.L.LLLLLLLLLLLLLLLLLLL.LLL +L.LL..LL....L.L......L...LLL......LL.L.....L.L.LL.L...L..L....L.LLL..LLL..L.L.L..LL...L.LL..LL.... +LLLLLL.LLLLLLL.L.LL.LLLLLLLLLLLLLLL.LLLLLLL..LLLL.LLLL.LLL.L.LLLLLLLLLLLLL.LLLLL.LLLL.LLLLLL.LL.LL +LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLL.LLLLLLLLLL.LLLL.LLLLL.L.LLL.LL.LLLL.LLL.LLLLLLLLLLLLL.LLLLL +LLLLLLLLLLLLLLLLLLL.LLL.LLLLL.LLLLL.L.L.LLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLL.LLLLL.LLLLL.LLLLL.LLLLL +L.LLLL.LLLLLL.LLLLLLL.LLLLLL.LL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL...LLL.LLLL..LLLLLLLLLLL.LLLLL +LLLLLL.LLLLLL.LLL.L.LLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLL.L.LLL.LLLLLLLL.LLLL.LLLLL.LLLL..LLLLLLLLLLL +LLLLLL.LLLLLLLLLLLL.LLLLLLLL.L.LLLL..LLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLL.LLLLLLLL.LLLLL.LLLLL.LLLLL +..L..LL....L.....L..L.LL.L..L.................L....L.....L....L..L...L..L....L...LL...LLL..LL..... +LLLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLL..L.LLLLL.LLL.L.LLLLL.LLLLL +LLLLLL.LLLLLL.L.LLLLLLLLLLLLLLLL.LL..LLLLLL.LLLLL.LLLL.LLLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLL +LLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLL..LLL.LLLLL.LL.LL.LLLLL.LLLLL +LLLLLL.LLLLLL..LLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLL.L.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLL.LLLLL.LLLLL +LLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLL.LL.LLLLLLLL +L.L...L..LL.L....LL...L..L.L.LL...L..L..L..L...L.LL.LL......L.L..L.L...LL.....L........LL...L..... +LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLL.LLLLL.LLLLLLLLL..LLLLLLLL.LLLL.LLLLLLLLLLLLLLLLL.LLLLL +LLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLL.LLLLLLLLLLL +LLLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LLLLL.LLLL.LLLLL.LLLLLLLL.LLLL.LLLLLLLLLLL.LLLLL.LLLL. +LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLL.LLLLLLL.LLLLLLLLLLL.LLLLLLLLLLL.LLLLL +LLLLLL.LLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLL..LLLLLLLLLLL.LLLLLLL.LLL.LLLLL.LLLLL +L.LLLL.LLLLLL.L.LLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLL.LLL.LLLL.LLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLL.LLLLL +...L..L.L...LL.....LL......L...L.....L.L......L..LLL.....L..LL....LLL...L..LL..LL.L.L.L.L..L...L.L +.LLLLL.LLLLLL.LLLLL..LLLLLLL.LLLLLLLL.LLLL..LLLLL.LL.L.LLLLL.LLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLL.L +LLLLLLLLLLLLL.LL.LL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLL..LLLL +LLLL.LLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLL..LLLL.LLLLLLLL.LLL...LLLL.LLLLL.LLLLLLLLLLL +LLL.LLLLLLLLL.LL.LL.LLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLL.L.LL.LLLLLLLLLLLLL.LLLLL.LLLLL.LLLLL.LLLLL +LLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLL.L.LLLLL.LLL.L.LLLLL.L.LLL +..L......LL.........L.L...L.....L.L...LLL.L.....L....L.L...L.L.L.L..L.....L..L...L..L.....L.L...L. +LLLLLL.LLLLLL.LLLLL.LLLL.LLLL.LLLLL.LLLLLLL.LLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLL.LL.LLLLLLLLLLL.LLLLL +.LLLLLLLLL.LL.L.LLL.LLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLL +LLLLLL.LLLLLLLLLLLLLL.LLLLLL.LL.LLLL.LLLLLL.LLLLLLLLL..LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLL.LLLLL +LLLLL..LLLLLL.LLLLL.LLLLLLLLLLLLL.L.LLLLLLL.LLLLLLLLLL.LLLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLL +LLLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL..LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLL.LLLLLLL +LLLLLL.LLLLLL..LLLL.LLLLLLL..L.LLLLLLLLLLLL.LL.LL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLL.L.LLL.LLL.L.LLLLL +LLLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLL..LLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLL.LLLL.LLLLL.LLLLL.LLLLL.LLLLL +LLLLLL.L.LLLL.LLLLL.LLL.LLL..LLLLLL.LLLLLLL.LLLLL.LLLL.LLLLL.L.LLLLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLL +.......L......LLL.....L....LL..L....L.L..L..L.L..L.L.....L...L..........L.....L.L.....L.L..LLL.L.. +LLLLLL.LLLLLL..LLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL.LL.LL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLL.LLLLL +LLLLLL.LLLLLL.LLLLL.L.LLLLLL.LLLLLL.LLL.LLL.LLLLL.LLLL.LLL.LLLLLLLLLLLLL.L.LL.LL.LLLLLL.LLLL.LL.LL +LLLLLL.LLL.LLLL.LLL.LL.LLLLL.LL.LLLLLLLLLLLLLLLLL.L.LL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLL +LLL.LL.LLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLL.LLLLLLL.LLLLL..LLL..LLLLL.LLLLL +LLLLLL..LLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLL.LLLLLLL..LLLL.LLLLL.LLLLLLLL..LLL.LLLLLLLLLLL.LL.LL.LLLLL +LLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLL.LL.LLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLLLLL.LLLLLL.L.LLLLLL.LLLLLLL.LLLLLL.L.L.LLLLL.LLLLLL.L.LLLLLLLLLL.LLLLL.LLLLL.LLLLL +.LLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLL..LLLL.LLLLL.LLLLLLLL.LLLL.LLLLLLLLLLL.LLLLLLLLLLL +LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLL.LLLLLLLLLLL +.L.LL....L..L...L.LLL.......L.LL.LL.L.L.L........LL..LL..L.......LL.L.LL...LLL.....L...L...L....L. +LLLLLL.LLLLLL.LLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLLLLL.LLLLL +LLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LLLLL.L.LL.LLLLLLLLLLLLLL..LLL.LLLLL.LLL.L.LLLLLLLLLL. +LLLLLL.LL.LLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLL..LLLL.LLLL.LLLLL.LLLLLLLL..LLLLLLLL.LLLLL..LLLLL.LLL.L +.LLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLL..LLLLLLLLL.LLLLLLLLLLLLLL.LLLL..LLLLLLLLLL.LLLLL.LLLLL +LLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLL.LLLLL.LLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLL.LL.LLLLL.LLLLL +LLLLLLLLLLLLL.LLLLL.LLLLLLLLLL.LLLL.LLLLLLL.LLLLL.LLLL.LLLLL.LLLLLLLL.LLLL.LLLLLLLLLLL..LLLL.LLLLL +LLLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLL +L........L........L.L.L...L........L..............L....L..L....L...L..L.LL.L..L.....L....LL..LL..L +LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LL.L.LLLLL.LLLLLLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLL +LLLLLLL.LLLLL.LLLLLLLLLLL..L.LL.LLLLLLLLLLLLLLLLLLLLLLLLL.LL.L.LLLLLL.L.LL.LLLLLLLLLLLLLLLLLLLLLLL +.LLLLL.LLLLL..LLLLL.LLLLLLLL.LLLLLL.LL.LLLL..LLL..LLLL.LLLLL.LLLLLLLL.LLLLLLLLLL.LLLLL.LLLLL.LLLLL +LLLLLL.LLLLLLL.LLLL.LLLLLLLL.LLLLLLLLLL.LLL.LLL.LL.LLL.LLLL.LLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLL +LL.LL..LLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LL.LLLLL.LLLL.L.LLL.LLLLLLLLLLLLL.LLLLL.LLLLL.LLLLL.LL.LL +LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLL.LLL.LLLLLL.LLLLL.LLLLLLLLLLL +LLLLLL.LLLLLLLLLLLL..LLLLLLL.LLLLLL..LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLL.L.LLLLL.LLLLLLLLLLL \ No newline at end of file