Day 21: Did some toposorting first

This commit is contained in:
Jonathan Chan 2022-12-21 17:21:24 -08:00
parent 336702726e
commit 7a3abcaa35
4 changed files with 5082 additions and 3382 deletions

1677
input/21.txt Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,31 +1,54 @@
#lang racket #lang racket
(require "../lib.rkt") (require "../lib.rkt"
data/queue)
(let ([bindings (define input
(for/list ([yell (problem-input 21)]) (for/hash ([yell (problem-input 21)])
(match yell (match yell
[(pregexp "(\\w+): (\\d+)" `(,_ ,monkey ,n)) [(pregexp "(\\w+): (\\d+)" `(,_ ,monkey ,n))
(format "(define (~a) ~a)" monkey n)] (values (string->symbol monkey) (string->number n))]
[(pregexp "(\\w+): (\\w+) (\\+|-|\\*|/) (\\w+)" `(,_ ,monkey ,monkey1 ,op ,monkey2)) [(pregexp "(\\w+): (\\w+) (\\+|-|\\*|/) (\\w+)" `(,_ ,monkey ,monkey1 ,op ,monkey2))
(format "(define (~a) (~a (~a) (~a)))" monkey op monkey1 monkey2)]))]) (values (string->symbol monkey) (map string->symbol `(,op ,monkey1 ,monkey2)))])))
(display-lines-to-file
`(,"#lang racket" ,@bindings "(root)")
"21-part1.rkt" #:exists 'replace))
(let ([bindings (define monkeys
(for/list ([yell (problem-input 21)]) (let ([Q (make-queue)])
(match yell (enqueue! Q 'root)
[(pregexp "humn: \\d+" `(,_)) (let loop ([monkeys '()])
"(define-symbolic humn integer?)"] (if (queue-empty? Q)
[(pregexp "root: (\\w+) (\\+|-|\\*|/) (\\w+)" `(,_ ,monkey1 ,op ,monkey2)) monkeys
(format "(define (root) (assert (eq? (~a) (~a))))" monkey1 monkey2)] (let ([monkey (dequeue! Q)])
[(pregexp "(\\w+): (\\w+) (\\+|-|\\*|/) humn" `(,_ ,monkey ,monkey1 ,op)) (match (hash-ref input monkey)
(format "(define (~a) (~a (~a) humn))" monkey op monkey1)] [(? number?) (loop (cons monkey monkeys))]
[(pregexp "(\\w+): (\\d+)" `(,_ ,monkey ,n)) [`(,_ ,monkey1 ,monkey2)
(format "(define (~a) ~a)" monkey n)] (enqueue! Q monkey1)
[(pregexp "(\\w+): (\\w+) (\\+|-|\\*|/) (\\w+)" `(,_ ,monkey ,monkey1 ,op ,monkey2)) (enqueue! Q monkey2)
(format "(define (~a) (~a (~a) (~a)))" monkey op monkey1 monkey2)]))]) (loop (cons monkey monkeys))]))))))
(display-lines-to-file
`(,"#lang rosette/safe" ,@bindings "(evaluate humn (solve (root)))") (define part1-defines
"21-part2.rkt" #:exists 'replace)) (for/list ([monkey monkeys])
(match (hash-ref input monkey)
[(? number? n) `(define ,monkey ,n)]
[`(,op ,monkey1 ,monkey2)
`(define ,monkey (,op ,monkey1 ,monkey2))])))
(define part2-defines
(for/list ([monkey monkeys])
(match (hash-ref input monkey)
[_ #:when (symbol=? monkey 'humn)
'(define-symbolic humn integer?)]
[(? number? n) `(define ,monkey ,n)]
[`(,op ,monkey1 ,monkey2)
`(define ,monkey (,op ,monkey1 ,monkey2))])))
(display-lines-to-file
`("#lang racket" ,@part1-defines root)
"21-part1.rkt" #:exists 'replace)
(display-lines-to-file
`("#lang rosette/safe"
,@part2-defines
(evaluate humn
(solve (assert (eq? ,(second (hash-ref input 'root))
,(third (hash-ref input 'root)))))))
"21-part2.rkt" #:exists 'replace)