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