Refactored Day 7.
This commit is contained in:
parent
8db4b43523
commit
46e2daa9af
31
src/07.rkt
31
src/07.rkt
|
@ -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)])
|
||||||
|
|
Loading…
Reference in New Issue