diff options
Diffstat (limited to 'day21.rkt')
-rw-r--r-- | day21.rkt | 58 |
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 |