Refactored Day 7.

This commit is contained in:
Jonathan Chan 2020-12-06 23:28:11 -08:00
parent e88ffd6961
commit 19e87e9dfc
1 changed files with 11 additions and 20 deletions

View File

@ -4,29 +4,20 @@
[get-neighbors get-neighbours]) [get-neighbors get-neighbours])
"../lib.rkt") "../lib.rkt")
(define (parse bag) (define input (problem-input 7))
(match-let* ([(list _ outer inners) (regexp-match #rx"^(.+) bags contain (.+)$" bag)]
[inner-list (map ( (∂r string-trim " bag")
(∂r string-trim " bags"))
(string-split (string-trim inners ".") ", "))]
[inner-bags (filter-map (match-lambda
[(regexp #px"(\\d+) (.+)" (list _ count style))
(cons (string->number count) style)]
[else #f])
inner-list)])
(cons outer inner-bags)))
(define input (map parse (problem-input 7))) (define (strings->graphs bags)
(define (containment-graphs bags)
(let ([contained (weighted-graph/directed '())] (let ([contained (weighted-graph/directed '())]
[contains (weighted-graph/directed '())]) [contains (weighted-graph/directed '())])
(for ([bag bags]) (for ([bag bags])
(match-let ([(list outer inners ...) bag]) (match-let ([(list _ outer inners) (regexp-match #rx"^(.+) bags contain (.+).$" bag)])
(for ([inner inners]) (for ([inner (string-split inners ",")])
(match-let ([(cons count style) inner]) (match inner
(add-directed-edge! contained style outer count) [(regexp #px"(\\d+) (.+) bags?" (list _ count inner))
(add-directed-edge! contains outer style count))))) (add-directed-edge! contained inner outer (string->number count))
(add-directed-edge! contains outer inner (string->number count))]
[else (add-vertex! contained outer)
(add-vertex! contains outer)]))))
(values contained contains))) (values contained contains)))
(define (count-bags graph source multiplier) (define (count-bags graph source multiplier)
@ -38,7 +29,7 @@
multiplier))) multiplier)))
(define-values (part1 part2) (define-values (part1 part2)
(let*-values ([(contained contains) (containment-graphs input)] (let*-values ([(contained contains) (strings->graphs input)]
[(bfs-shiny-gold pred) (bfs contained "shiny gold")] [(bfs-shiny-gold pred) (bfs contained "shiny gold")]
[(reachables) (count ( ( != +inf.0) cdr) (hash->list bfs-shiny-gold))] [(reachables) (count ( ( != +inf.0) cdr) (hash->list bfs-shiny-gold))]
[(total-bags) (count-bags contains "shiny gold" 1)]) [(total-bags) (count-bags contains "shiny gold" 1)])