Day 8 more refactoring

This commit is contained in:
Jonathan Chan 2022-12-08 02:51:12 -05:00
parent fe70ec4b9c
commit 64f50e52f5
2 changed files with 27 additions and 33 deletions

View File

@ -333,3 +333,10 @@
(for/first ([i (vector-length vec)] (for/first ([i (vector-length vec)]
#:when (p (vector-ref vec i))) #:when (p (vector-ref vec i)))
i)) i))
;; Sequence helpers ;;
;; in-reverse-range : number? -> sequence?
(define (in-reverse-range n)
(in-range (sub1 n) -1 -1))

View File

@ -24,32 +24,32 @@
(define (part1) (define (part1)
(define talls (mutable-set)) (define talls (mutable-set))
(for ([r (range height)]) (for ([r (in-range height)])
(set-add! talls (cons r 0)) (set-add! talls (cons r 0))
(set-add! talls (cons r (sub1 width))) (set-add! talls (cons r (sub1 width)))
(for/fold ([tallest (get-tree r 0)]) (for/fold ([tallest (get-tree r 0)])
([c (range width)]) ([c (in-range width)])
(define t (get-tree r c)) (define t (get-tree r c))
(if (< tallest t) (if (< tallest t)
(begin (set-add! talls (cons r c)) t) (begin (set-add! talls (cons r c)) t)
tallest)) tallest))
(for/fold ([tallest (get-tree r (sub1 width))]) (for/fold ([tallest (get-tree r (sub1 width))])
([c (reverse (range width))]) ([c (in-reverse-range width)])
(define t (get-tree r c)) (define t (get-tree r c))
(if (< tallest t) (if (< tallest t)
(begin (set-add! talls (cons r c)) t) (begin (set-add! talls (cons r c)) t)
tallest))) tallest)))
(for ([c (range width)]) (for ([c (in-range width)])
(set-add! talls (cons 0 c)) (set-add! talls (cons 0 c))
(set-add! talls (cons (sub1 height) c)) (set-add! talls (cons (sub1 height) c))
(for/fold ([tallest (get-tree 0 c)]) (for/fold ([tallest (get-tree 0 c)])
([r (range height)]) ([r (in-range height)])
(define t (get-tree r c)) (define t (get-tree r c))
(if (< tallest t) (if (< tallest t)
(begin (set-add! talls (cons r c)) t) (begin (set-add! talls (cons r c)) t)
tallest)) tallest))
(for/fold ([tallest (get-tree (sub1 height) c)]) (for/fold ([tallest (get-tree (sub1 height) c)])
([r (reverse (range height))]) ([r (in-reverse-range height)])
(define t (get-tree r c)) (define t (get-tree r c))
(if (< tallest t) (if (< tallest t)
(begin (set-add! talls (cons r c)) t) (begin (set-add! talls (cons r c)) t)
@ -58,36 +58,23 @@
(define (score r c) (define (score r c)
(define t (get-tree r c)) (define t (get-tree r c))
(define s1 (* (for/last ([c* (in-range (add1 c) width)]
(let loop ([c* (add1 c)]) #:final (>= (get-tree r c*) t))
(if (or (>= c* (sub1 width)) (- c* c))
(>= (get-tree r c*) t)) (for/last ([c* (in-reverse-range c)]
(- c* c) #:final (>= (get-tree r c*) t))
(loop (add1 c*))))) (- c c*))
(define s2 (for/last ([r* (in-range (add1 r) height)]
(let loop ([c* (sub1 c)]) #:final (>= (get-tree r* c) t))
(if (or (<= c* 0) (- r* r))
(>= (get-tree r c*) t)) (for/last ([r* (in-reverse-range r)]
(- c c*) #:final (>= (get-tree r* c) t))
(loop (sub1 c*))))) (- r r*))))
(define s3
(let loop ([r* (add1 r)])
(if (or (>= r* (sub1 height))
(>= (get-tree r* c) t))
(- r* r)
(loop (add1 r*)))))
(define s4
(let loop ([r* (sub1 r)])
(if (or (<= r* 0)
(>= (get-tree r* c) t))
(- r r*)
(loop (sub1 r*)))))
(* s1 s2 s3 s4))
(define part2 (define part2
(maximum (maximum
(for*/list ([r (range 1 (sub1 height))] (for*/list ([r (in-range 1 (sub1 height))]
[c (range 1 (sub1 width))]) [c (in-range 1 (sub1 width))])
(score r c)))) (score r c))))
(show-solution (part1) part2) (show-solution (part1) part2)