You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
aoc-racket/2020/07.rkt

38 lines
1.2 KiB
Racket

4 years ago
#lang br
(require racket/file graph rackunit)
(struct $bag (weight name))
(define parsed-baglists
(for/list ([ln (file->lines "07.rktd")])
(for/list ([str (string-split ln #px" bags?[,.]?")])
(define pcs (string-split str))
($bag
(and (>= (length pcs) 3) (string->number (car (take-right pcs 3))))
(string-join (take-right pcs 2))))))
(define g1 (unweighted-graph/directed
(for*/list ([baglist parsed-baglists]
[bag (cdr baglist)])
(list ($bag-name bag) ($bag-name (car baglist))))))
(define-values (distances _) (dijkstra g1 "shiny gold"))
(check-equal? (count exact-positive-integer? (hash-values distances)) 222)
(define g2 (weighted-graph/directed
(for*/list ([baglist parsed-baglists]
[bag (cdr baglist)])
(match-define ($bag weight name) bag)
(list weight ($bag-name (car baglist)) name))))
(define (bag-count name)
(+ 1 (for*/sum ([name2 (get-neighbors g2 name)]
[weight (in-value (edge-weight g2 name name2))]
#:when (exact-positive-integer? weight))
(* weight (bag-count name2)))))
(check-equal? (sub1 (bag-count "shiny gold")) 13264)