Day 8 refactor, just a little

This commit is contained in:
Jonathan Chan 2022-12-08 02:21:43 -05:00
parent d195797bbc
commit fe70ec4b9c
1 changed files with 36 additions and 59 deletions

View File

@ -12,72 +12,49 @@
(define input (define input
(~>> (problem-input 8) #;test (~>> (problem-input 8) #;test
(map string->list) (map string->list)
(mmap char->number))) (mmap char->number)
(map list->vector)
list->vector))
(define (get-tree r c) (define (get-tree r c)
(list-ref (list-ref input r) c)) (vector-ref (vector-ref input r) c))
(define width (length (first input))) (define width (vector-length (vector-first input)))
(define height (length input)) (define height (vector-length input))
(define (part1) (define (part1)
(define s1 (define talls (mutable-set))
(for/fold ([talls (set)]) (for ([r (range height)])
([r (range height)]) (set-add! talls (cons r 0))
(for/fold ([talls talls] (set-add! talls (cons r (sub1 width)))
[tallest (get-tree r 0)] (for/fold ([tallest (get-tree r 0)])
#:result talls)
([c (range width)]) ([c (range width)])
(define t (get-tree r c)) (define t (get-tree r c))
(if (< tallest t) (if (< tallest t)
(values (set-add talls (cons r c)) t) (begin (set-add! talls (cons r c)) t)
(values talls tallest))))) tallest))
(define s2 (for/fold ([tallest (get-tree r (sub1 width))])
(for/fold ([talls s1])
([r (range height)])
(for/fold ([talls talls]
[tallest (get-tree r (sub1 width))]
#:result talls)
([c (reverse (range width))]) ([c (reverse (range width))])
(define t (get-tree r c)) (define t (get-tree r c))
(if (< tallest t) (if (< tallest t)
(values (set-add talls (cons r c)) t) (begin (set-add! talls (cons r c)) t)
(values talls tallest))))) tallest)))
(define s3 (for ([c (range width)])
(for/fold ([talls s2]) (set-add! talls (cons 0 c))
([c (range width)]) (set-add! talls (cons (sub1 height) c))
(for/fold ([talls talls] (for/fold ([tallest (get-tree 0 c)])
[tallest (get-tree 0 c)]
#:result talls)
([r (range height)]) ([r (range height)])
(define t (get-tree r c)) (define t (get-tree r c))
(if (< tallest t) (if (< tallest t)
(values (set-add talls (cons r c)) t) (begin (set-add! talls (cons r c)) t)
(values talls tallest))))) tallest))
(define s4 (for/fold ([tallest (get-tree (sub1 height) c)])
(for/fold ([talls s3])
([c (range width)])
(for/fold ([talls talls]
[tallest (get-tree (sub1 height) c)]
#:result talls)
([r (reverse (range height))]) ([r (reverse (range height))])
(define t (get-tree r c)) (define t (get-tree r c))
(if (< tallest t) (if (< tallest t)
(values (set-add talls (cons r c)) t) (begin (set-add! talls (cons r c)) t)
(values talls tallest))))) tallest)))
(define s5 (set-count talls))
(for/fold ([talls s4])
([r (range height)])
(~> talls
(set-add (cons r 0))
(set-add (cons r (sub1 width))))))
(define s6
(for/fold ([talls s5])
([c (range width)])
(~> talls
(set-add (cons 0 c))
(set-add (cons (sub1 height) c)))))
(set-count s6))
(define (score r c) (define (score r c)
(define t (get-tree r c)) (define t (get-tree r c))