blob: fa5f3efb12e50705f3bfd4705a571c3d8f3e48af (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
#lang racket
(define monkeys (make-hash))
(for ([line (file->lines "day21")])
(let* ([parts (string-split line ": ")]
[words (string-split (second parts) " ")])
(if (= (length words) 1)
(hash-set! monkeys (first parts) (string->number (first words)))
(hash-set! monkeys (first parts) (list
(case (second words)
[("+") +]
[("-") -]
[("*") *]
[("/") quotient])
(first words)
(third words))))))
(define (eval-monkey m)
(match (hash-ref monkeys m)
[(list op m1 m2) (op (eval-monkey m1) (eval-monkey m2))]
[n n]))
(eval-monkey "root")
;; 353837700405464
(define (part2 m)
(case m
[("root") (match (hash-ref monkeys m)
[(list _ m1 m2) (list '= (part2 m1) (part2 m2))])]
[("humn") 'humn]
[else (match (hash-ref monkeys m)
[(list op m1 m2) (list op (part2 m1) (part2 m2))]
[n n])]))
(define (partial-eval t)
(match t
[(list op t1 t2) (match (list (partial-eval t1) (partial-eval t2))
[(list (? number? n1) (? number? n2))
(op n1 n2)]
[(list v1 v2)
(list op v1 v2)])]
[n n]))
(define (solve l r)
(match l
[(list (== quotient) l1 (? number? l2)) (solve l1 (* l2 r))]
[(list (== +) (? number? l1) l2) (solve l2 (- r l1))]
[(list (== +) l1 (? number? l2)) (solve l1 (- r l2))]
[(list (== *) (? number? l1) l2) (solve l2 (quotient r l1))]
[(list (== *) l1 (? number? l2)) (solve l1 (quotient r l2))]
[(list (== -) l1 (? number? l2)) (solve l1 (+ r l2))]
[(list (== -) (? number? l1) l2) (solve l2 (- l1 r))]
[e (list '= l r)]
))
(apply solve (cdr (partial-eval (part2 "root"))))
;; 3678125408017
|