1
0
Fork 0

Day 11: Cleanup.

This commit is contained in:
Jonathan Chan 2021-12-11 10:55:04 -08:00 committed by Jonathan Chan
parent 63fd991e58
commit 5ca55d25ad
1 changed files with 24 additions and 20 deletions

View File

@ -1,6 +1,7 @@
#lang curly-fn racket #lang curly-fn racket
(require "../lib.rkt") (require racket/set
"../lib.rkt")
(define input (define input
(for/vector ([row (problem-input 11)]) (for/vector ([row (problem-input 11)])
@ -15,7 +16,11 @@
(vector-ref (vector-ref grid row) col)) (vector-ref (vector-ref grid row) col))
(define (grid-update! grid row col f) (define (grid-update! grid row col f)
(vector-set! (vector-ref grid row) col (f (grid-ref grid row col)))) (let ([vec (vector-ref grid row)])
(vector-set! vec col (f (vector-ref vec col)))))
(define (grid-set! grid row col v)
(grid-update! grid row col (const v)))
(define (adjs grid row col) (define (adjs grid row col)
(for*/list ([r (range* (max 0 (sub1 row)) (min (sub1 rows) (add1 row)))] (for*/list ([r (range* (max 0 (sub1 row)) (min (sub1 rows) (add1 row)))]
@ -23,35 +28,35 @@
(cons r c))) (cons r c)))
(define (incr! octopodes) (define (incr! octopodes)
(for ([row (range rows)]) (for* ([row (range rows)]
(for ([col (range cols)]) [col (range cols)])
(grid-update! octopodes row col add1)))) (grid-update! octopodes row col add1)))
(define (flash! flashed octopodes) (define (flash! flashed octopodes)
(for*/fold ([newly-flashed '()]) (for*/fold ([newly-flashed (set)])
([row (range rows)] ([row (range rows)]
[col (range cols)]) [col (range cols)])
(if (and (not (member (cons row col) flashed)) (if (and (not (set-member? flashed (cons row col)))
(> (grid-ref octopodes row col) 9) (> (grid-ref octopodes row col) 9)
(for ([adj (adjs octopodes row col)]) (for ([adj (adjs octopodes row col)])
(grid-update! octopodes (car adj) (cdr adj) add1))) (grid-update! octopodes (car adj) (cdr adj) add1)))
(cons (cons row col) newly-flashed) (set-add newly-flashed (cons row col))
newly-flashed))) newly-flashed)))
(define (decharge! octopodes) (define (decharge! octopodes)
(for ([row (range rows)]) (for* ([row (range rows)]
(for ([col (range cols)]) [col (range cols)])
(when (> (grid-ref octopodes row col) 9) (when (> (grid-ref octopodes row col) 9)
(grid-update! octopodes row col (const 0)))))) (grid-set! octopodes row col 0))))
(define (step! octopodes) (define (step! octopodes)
(incr! octopodes) (incr! octopodes)
(define flashes (define flashes
(let loop ([flashed '()]) (let loop ([flashed (set)])
(let ([newly-flashed (flash! flashed octopodes)]) (let ([newly-flashed (flash! flashed octopodes)])
(if (empty? newly-flashed) (if (set-empty? newly-flashed)
(length flashed) (set-count flashed)
(loop (append newly-flashed flashed)))))) (loop (set-union newly-flashed flashed))))))
(decharge! octopodes) (decharge! octopodes)
flashes) flashes)
@ -60,9 +65,8 @@
(step! input))) (step! input)))
(define part2 (define part2
(let loop ([steps 101]) (for/last ([steps (in-naturals 101)]
(if (= (step! input) total) #:final (= (step! input) total))
steps steps))
(loop (add1 steps)))))
(show-solution part1 part2) (show-solution part1 part2)