diff --git a/src/11.rkt b/src/11.rkt index 865f614..ebbf479 100644 --- a/src/11.rkt +++ b/src/11.rkt @@ -1,6 +1,7 @@ #lang curly-fn racket -(require "../lib.rkt") +(require racket/set + "../lib.rkt") (define input (for/vector ([row (problem-input 11)]) @@ -15,7 +16,11 @@ (vector-ref (vector-ref grid row) col)) (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) (for*/list ([r (range* (max 0 (sub1 row)) (min (sub1 rows) (add1 row)))] @@ -23,35 +28,35 @@ (cons r c))) (define (incr! octopodes) - (for ([row (range rows)]) - (for ([col (range cols)]) - (grid-update! octopodes row col add1)))) + (for* ([row (range rows)] + [col (range cols)]) + (grid-update! octopodes row col add1))) (define (flash! flashed octopodes) - (for*/fold ([newly-flashed '()]) + (for*/fold ([newly-flashed (set)]) ([row (range rows)] [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) (for ([adj (adjs octopodes row col)]) (grid-update! octopodes (car adj) (cdr adj) add1))) - (cons (cons row col) newly-flashed) + (set-add newly-flashed (cons row col)) newly-flashed))) (define (decharge! octopodes) - (for ([row (range rows)]) - (for ([col (range cols)]) - (when (> (grid-ref octopodes row col) 9) - (grid-update! octopodes row col (const 0)))))) + (for* ([row (range rows)] + [col (range cols)]) + (when (> (grid-ref octopodes row col) 9) + (grid-set! octopodes row col 0)))) (define (step! octopodes) (incr! octopodes) (define flashes - (let loop ([flashed '()]) + (let loop ([flashed (set)]) (let ([newly-flashed (flash! flashed octopodes)]) - (if (empty? newly-flashed) - (length flashed) - (loop (append newly-flashed flashed)))))) + (if (set-empty? newly-flashed) + (set-count flashed) + (loop (set-union newly-flashed flashed)))))) (decharge! octopodes) flashes) @@ -60,9 +65,8 @@ (step! input))) (define part2 - (let loop ([steps 101]) - (if (= (step! input) total) - steps - (loop (add1 steps))))) + (for/last ([steps (in-naturals 101)] + #:final (= (step! input) total)) + steps)) (show-solution part1 part2) \ No newline at end of file