aoc2020/7.rkt

52 lines
1.6 KiB
Racket
Raw Normal View History

#lang curly-fn racket
(require "scripts/aoc.rkt")
;; solution for day 7
(define (part1 adjlist all-colors wanted)
(define (dfs src dest)
(for/or ([item (in-list (hash-ref adjlist src '()))])
(or (dfs (car item) dest) (string=? (car item) dest))))
;; bad solution
(for/sum ([src (in-set all-colors)])
(if (dfs src wanted) 1 0)))
(define (part2 adjlist all-colors wanted)
(define (part2-impl src)
(add1
(for/sum ([subbag (in-list (hash-ref adjlist src '()))])
(* (cdr subbag) (part2-impl (car subbag))))))
(sub1 (part2-impl wanted)))
(module+ main
(define input (file->lines "inputs/7"))
(define all-colors (mutable-set))
(define adjlist
(for/hash ([line (in-list input)])
(match line
[(pregexp #px"^([a-z ]+) bags contain ([^\\.]+).$" (list _ src-color contains))
(set-add! all-colors src-color)
(values src-color
(if (string=? "no other bags" contains)
'()
(for/list ([item (in-list (string-split contains ", "))])
(match item
[(pregexp #px"^([0-9]+) ([a-z ]+) bag[s]?"
(list _ (app string->number number) color))
(set-add! all-colors color)
(cons color number)]
[x (error "not shonks" x)]))))]
[x (error "not shonks" x)])))
(define wanted "shiny gold")
;; part 1
(answer 7 1 (part1 adjlist all-colors wanted))
;; part 2
(answer 7 2 (part2 adjlist all-colors wanted))
(displayln "meow"))