Day 11: Cleanup.
This commit is contained in:
parent
b49762c1b5
commit
6912f22c1a
42
src/11.rkt
42
src/11.rkt
|
@ -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)
|
Loading…
Reference in New Issue