about summary refs log tree commit diff
path: root/day21.rkt
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