From 46e2daa9af9a76591ad614d2d3db8d7030146e38 Mon Sep 17 00:00:00 2001 From: Jonathan Chan Date: Sun, 6 Dec 2020 23:28:11 -0800 Subject: [PATCH] Refactored Day 7. --- src/07.rkt | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/src/07.rkt b/src/07.rkt index ff26efe..2d59131 100644 --- a/src/07.rkt +++ b/src/07.rkt @@ -4,29 +4,20 @@ [get-neighbors get-neighbours]) "../lib.rkt") -(define (parse bag) - (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 (problem-input 7)) -(define input (map parse (problem-input 7))) - -(define (containment-graphs bags) +(define (strings->graphs bags) (let ([contained (weighted-graph/directed '())] [contains (weighted-graph/directed '())]) (for ([bag bags]) - (match-let ([(list outer inners ...) bag]) - (for ([inner inners]) - (match-let ([(cons count style) inner]) - (add-directed-edge! contained style outer count) - (add-directed-edge! contains outer style count))))) + (match-let ([(list _ outer inners) (regexp-match #rx"^(.+) bags contain (.+).$" bag)]) + (for ([inner (string-split inners ",")]) + (match inner + [(regexp #px"(\\d+) (.+) bags?" (list _ count inner)) + (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))) (define (count-bags graph source multiplier) @@ -38,7 +29,7 @@ multiplier))) (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")] [(reachables) (count (∘ (∂ != +inf.0) cdr) (hash->list bfs-shiny-gold))] [(total-bags) (count-bags contains "shiny gold" 1)])