about summary refs log tree commit diff
path: root/day21.rkt
diff options
context:
space:
mode:
Diffstat (limited to 'day21.rkt')
-rw-r--r--day21.rkt58
1 files changed, 58 insertions, 0 deletions
diff --git a/day21.rkt b/day21.rkt
new file mode 100644
index 0000000..fa5f3ef
--- /dev/null
+++ b/day21.rkt
@@ -0,0 +1,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