diff --git a/src/15.rkt b/src/15.rkt index b08f0be..cbb677d 100644 --- a/src/15.rkt +++ b/src/15.rkt @@ -3,6 +3,8 @@ (require graph (except-in "../lib.rkt" transpose)) +(struct posn (row col) #:transparent) + (define input (for/vector ([row (problem-input 15)]) (for/vector ([col (string->list row)]) @@ -21,29 +23,18 @@ (filter #{and (<= 0 (car %) (sub1 dim)) (<= 0 (cdr %) (sub1 dim))} `((,(add1 row) . ,col) (,(sub1 row) . ,col) (,row . ,(add1 col)) (,row . ,(sub1 col))))) -(for/fold ([weights (hash '(0 . 0) 0)] - #:result (printf "Part 1: ~a\n" (hash-ref weights `(,(sub1 dim) . ,(sub1 dim))))) - ([diag (range* 0 (+ dim dim))]) - (for/fold ([weights weights]) - ([row (range* 0 diag 1)] - [col (range* diag 0 -1)] - #:when (and (< row dim) (< col dim))) - (for/fold ([weights weights]) - ([adj (adjs dim row col)]) - (match-let* ([(cons row* col*) adj] - [weight (+ (grid-ref row* col*) - (hash-ref weights (cons row col)))]) - (hash-update weights adj #{if (< weight %) weight %} +inf.0))))) - (define (make-graph dim) (define graph (weighted-graph/directed '())) (for* ([row (range dim)] [col (range dim)] [adj (adjs dim row col)]) - (add-directed-edge! graph (cons row col) adj (grid-ref (car adj) (cdr adj)))) - (displayln "Graph created.") + (add-directed-edge! graph (posn row col) + (posn (car adj) (cdr adj)) + (grid-ref (car adj) (cdr adj)))) graph) -(let*-values ([(dim) (* dim 5)] - [(weights paths) (dijkstra (make-graph dim) '(0 . 0))]) - (printf "Part 2: ~a\n" (hash-ref weights `(,(sub1 dim) . ,(sub1 dim))))) \ No newline at end of file +(define (shortest-path dim) + (let*-values ([(weights paths) (dijkstra (make-graph dim) (posn 0 0))]) + (hash-ref weights (posn (sub1 dim) (sub1 dim))))) + +(show-solution (shortest-path dim) (shortest-path (* dim 5))) \ No newline at end of file