2022/src/08.rkt

93 lines
2.3 KiB
Racket

#lang racket
(require "../lib.rkt")
(define test
'("30373"
"25512"
"65332"
"33549"
"35390"))
(define input
(~>> (problem-input 8) #;test
(map string->list)
(mmap char->number)
(map list->vector)
list->vector))
(define (get-tree r c)
(vector-ref (vector-ref input r) c))
(define width (vector-length (vector-first input)))
(define height (vector-length input))
(define (part1)
(define talls (mutable-set))
(for ([r (range height)])
(set-add! talls (cons r 0))
(set-add! talls (cons r (sub1 width)))
(for/fold ([tallest (get-tree r 0)])
([c (range width)])
(define t (get-tree r c))
(if (< tallest t)
(begin (set-add! talls (cons r c)) t)
tallest))
(for/fold ([tallest (get-tree r (sub1 width))])
([c (reverse (range width))])
(define t (get-tree r c))
(if (< tallest t)
(begin (set-add! talls (cons r c)) t)
tallest)))
(for ([c (range width)])
(set-add! talls (cons 0 c))
(set-add! talls (cons (sub1 height) c))
(for/fold ([tallest (get-tree 0 c)])
([r (range height)])
(define t (get-tree r c))
(if (< tallest t)
(begin (set-add! talls (cons r c)) t)
tallest))
(for/fold ([tallest (get-tree (sub1 height) c)])
([r (reverse (range height))])
(define t (get-tree r c))
(if (< tallest t)
(begin (set-add! talls (cons r c)) t)
tallest)))
(set-count talls))
(define (score r c)
(define t (get-tree r c))
(define s1
(let loop ([c* (add1 c)])
(if (or (>= c* (sub1 width))
(>= (get-tree r c*) t))
(- c* c)
(loop (add1 c*)))))
(define s2
(let loop ([c* (sub1 c)])
(if (or (<= c* 0)
(>= (get-tree r c*) t))
(- c c*)
(loop (sub1 c*)))))
(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
(maximum
(for*/list ([r (range 1 (sub1 height))]
[c (range 1 (sub1 width))])
(score r c))))
(show-solution (part1) part2)