aboutsummaryrefslogtreecommitdiff
path: root/2022/day-21
diff options
context:
space:
mode:
authorHunky Jimpjorps <thechairman@thechairman.info>2022-12-21 10:27:48 -0500
committerHunky Jimpjorps <thechairman@thechairman.info>2022-12-21 10:27:48 -0500
commit7d83fb6a52dfbb5b96b9d2de6b9e06dd78e60faa (patch)
tree1fb3d6dcf2778106f5edef12b34fa83a041c4189 /2022/day-21
parent6ac92474ce6cb7ef853ddce86dadfb136069e931 (diff)
downloadgleam_aoc-7d83fb6a52dfbb5b96b9d2de6b9e06dd78e60faa.tar.gz
gleam_aoc-7d83fb6a52dfbb5b96b9d2de6b9e06dd78e60faa.zip
day 21 cleanup
Diffstat (limited to '2022/day-21')
-rw-r--r--2022/day-21/day-21.rkt32
1 files changed, 11 insertions, 21 deletions
diff --git a/2022/day-21/day-21.rkt b/2022/day-21/day-21.rkt
index 60ee4d8..752dfb8 100644
--- a/2022/day-21/day-21.rkt
+++ b/2022/day-21/day-21.rkt
@@ -19,40 +19,30 @@
(for/hash ([m raw-monkeys] #:do [(match-define (monkey name op) (parse-monkey m))])
(values name op)))
-(define (parse f name1 name2)
+;; part 1
+(define (evaluate-monkey m-name [guess #f])
+ (match-define (op f name1 name2)
+ (if (and guess (equal? m-name "humn"))
+ (op 'constant guess #f)
+ (hash-ref monkey-table m-name)))
(match f
['constant name1]
- ['+ (+ (evaluate-monkey name1) (evaluate-monkey name2))]
- ['- (- (evaluate-monkey name1) (evaluate-monkey name2))]
- ['* (* (evaluate-monkey name1) (evaluate-monkey name2))]
- ['/ (/ (evaluate-monkey name1) (evaluate-monkey name2))]))
-
-;; part 1
-(define (evaluate-monkey m-name)
- (match-define (op f name1 name2) (hash-ref monkey-table m-name))
- (parse f name1 name2))
+ ['+ (+ (evaluate-monkey name1 guess) (evaluate-monkey name2 guess))]
+ ['- (- (evaluate-monkey name1 guess) (evaluate-monkey name2 guess))]
+ ['* (* (evaluate-monkey name1 guess) (evaluate-monkey name2 guess))]
+ ['/ (/ (evaluate-monkey name1 guess) (evaluate-monkey name2 guess))]))
(evaluate-monkey "root")
;; part 2
(match-define (op _ branch-1 branch-2) (hash-ref monkey-table "root"))
-(define (evaluate-monkey* m-name guess)
- (match-define (op f name1 name2)
- (if (equal? m-name "humn") (op 'constant guess #f) (hash-ref monkey-table m-name)))
- (match f
- ['constant name1]
- ['+ (+ (evaluate-monkey* name1 guess) (evaluate-monkey* name2 guess))]
- ['- (- (evaluate-monkey* name1 guess) (evaluate-monkey* name2 guess))]
- ['* (* (evaluate-monkey* name1 guess) (evaluate-monkey* name2 guess))]
- ['/ (/ (evaluate-monkey* name1 guess) (evaluate-monkey* name2 guess))]))
-
;; the branch that doesn't depend on humn
(define result-2 (evaluate-monkey branch-2))
;; I plugged in numbers for guess to find a suitable starting range and settled on the first one
;; that I found that got me within a million
(for/first ([guess (in-naturals 3059361690000)]
- #:do [(define result-1 (evaluate-monkey* branch-1 guess))]
+ #:do [(define result-1 (evaluate-monkey branch-1 guess))]
#:when (= result-1 result-2))
guess)