Refactored Day 11 for performance.
This commit is contained in:
parent
4dc2dd17d9
commit
7946946bd7
37
src/11.rkt
37
src/11.rkt
|
@ -1,20 +1,13 @@
|
||||||
#lang curly-fn racket
|
#lang curly-fn racket
|
||||||
|
|
||||||
(require "../lib.rkt")
|
(require threading
|
||||||
|
"../lib.rkt")
|
||||||
|
|
||||||
(define input (lists->vectors (map string->list (problem-input 11))))
|
(define input (lists->vectors (map string->list (problem-input 11))))
|
||||||
(define width (vector-length (vector-ref input 0)))
|
(define width (vector-length (vector-ref input 0)))
|
||||||
(define length (vector-length input))
|
(define length (vector-length input))
|
||||||
|
|
||||||
(define (neighbours seats r c)
|
(define (first-seat r c dr dc)
|
||||||
(count
|
|
||||||
#{char=? % #\#}
|
|
||||||
(for*/list ([r* (in-range (max 0 (sub1 r)) (min (+ r 2) length))]
|
|
||||||
[c* (in-range (max 0 (sub1 c)) (min (+ c 2) width))]
|
|
||||||
#:unless (and (= r r*) (= c c*)))
|
|
||||||
(vector-ref (vector-ref seats r*) c*))))
|
|
||||||
|
|
||||||
(define (visible-in seats r c dr dc)
|
|
||||||
(define rs
|
(define rs
|
||||||
(cond
|
(cond
|
||||||
[(positive? dr) (in-range r length dr)]
|
[(positive? dr) (in-range r length dr)]
|
||||||
|
@ -28,13 +21,27 @@
|
||||||
(for/or ([r* rs]
|
(for/or ([r* rs]
|
||||||
[c* cs]
|
[c* cs]
|
||||||
#:unless (and (= r r*) (= c c*)))
|
#:unless (and (= r r*) (= c c*)))
|
||||||
(define seat (vector-ref (vector-ref seats r*) c*))
|
(define seat (vector-ref (vector-ref input r*) c*))
|
||||||
#:final (member seat '(#\L #\#))
|
(and (member seat '(#\L #\#))
|
||||||
(char=? seat #\#)))
|
(list r* c*))))
|
||||||
|
|
||||||
|
(define first-seats
|
||||||
|
(for*/hash ([r (in-range 0 length)]
|
||||||
|
[c (in-range 0 width)])
|
||||||
|
(values (list r c)
|
||||||
|
(filter-map (match-lambda [`(,dr ,dc) (first-seat r c dr dc)])
|
||||||
|
'((-1 -1) (-1 0) (-1 1) (0 -1) (0 1) (1 -1) (1 0) (1 1))))))
|
||||||
|
|
||||||
|
(define (neighbours seats r c)
|
||||||
|
(for*/sum ([r* (in-range (max 0 (sub1 r)) (min (+ r 2) length))]
|
||||||
|
[c* (in-range (max 0 (sub1 c)) (min (+ c 2) width))]
|
||||||
|
#:unless (and (= r r*) (= c c*)))
|
||||||
|
(if (char=? (vector-ref (vector-ref seats r*) c*) #\#) 1 0)))
|
||||||
|
|
||||||
(define (visible seats r c)
|
(define (visible seats r c)
|
||||||
(count (match-lambda [`(,dr ,dc) (visible-in seats r c dr dc)])
|
(count
|
||||||
'((-1 -1) (-1 0) (-1 1) (0 -1) (0 1) (1 -1) (1 0) (1 1))))
|
(match-lambda [`(,r* ,c*) (char=? (vector-ref (vector-ref seats r*) c*) #\#)])
|
||||||
|
(hash-ref first-seats (list r c))))
|
||||||
|
|
||||||
(define (step-seats counter die seats)
|
(define (step-seats counter die seats)
|
||||||
(let ([new-seats (vector-map vector-copy (vector-copy seats))])
|
(let ([new-seats (vector-map vector-copy (vector-copy seats))])
|
||||||
|
|
Loading…
Reference in New Issue