52 lines
1.6 KiB
Racket
52 lines
1.6 KiB
Racket
|
#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"))
|