about summary refs log tree commit diff
path: root/day11.rkt
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2022-12-12 16:10:27 +0100
committerLeah Neukirchen <leah@vuxu.org>2022-12-12 16:10:27 +0100
commitf90a394ad0ed43700f8a440bfdbbd89fc04457fe (patch)
tree3dfc112d6136195360ef4ed10cf4d35c6226ab00 /day11.rkt
parent882de2716ecdc34e2bf6ae656fba8d7905ea4b94 (diff)
downloadadventofcode2022-f90a394ad0ed43700f8a440bfdbbd89fc04457fe.tar.gz
adventofcode2022-f90a394ad0ed43700f8a440bfdbbd89fc04457fe.tar.xz
adventofcode2022-f90a394ad0ed43700f8a440bfdbbd89fc04457fe.zip
day11
Diffstat (limited to 'day11.rkt')
-rw-r--r--day11.rkt57
1 files changed, 57 insertions, 0 deletions
diff --git a/day11.rkt b/day11.rkt
new file mode 100644
index 0000000..e37e404
--- /dev/null
+++ b/day11.rkt
@@ -0,0 +1,57 @@
+#lang racket
+
+(struct monkey
+  (items operation divisible if-true if-false inspections)
+  #:mutable #:transparent)
+
+(define (parse desc)
+  (let* ([lines (string-split desc "\n")]
+         [items (map string->number
+                     (string-split (second (string-split (second lines) ": "))
+                                   ", "))]
+         [operation
+          (match (string-split (second (string-split (third lines) "old ")) " ")
+            [(list "*" "old") (lambda (old) (* old old))]
+            [(list "*" n)     (lambda (old) (* old (string->number n)))]
+            [(list "+" n)     (lambda (old) (+ old (string->number n)))])]
+         [test (string->number (last (string-split (fourth lines) " ")))]
+         [if-true (string->number (last (string-split (fifth lines) " ")))]
+         [if-false (string->number (last (string-split (sixth lines) " ")))]
+         )
+    (monkey items operation test if-true if-false 0)))
+
+(define monkeys
+  (for/vector ([para (string-split (file->string "day11") "\n\n")])
+    (parse para)))
+
+(define q (for/product ([m monkeys]) (monkey-divisible m)))
+
+(define (step monkeys part)
+  (for ([m monkeys])
+    (for ([item (monkey-items m)])
+      (let* ([worry ((monkey-operation m) item)]
+             [worry-bored (if (= part 1)
+                              (quotient worry 3)
+                              (remainder worry q))]
+             [to (if (zero? (remainder worry-bored (monkey-divisible m)))
+                     (monkey-if-true m)
+                     (monkey-if-false m))]
+             [mto (vector-ref monkeys to)])
+        (set-monkey-inspections! m (+ 1 (monkey-inspections m)))
+        (set-monkey-items! mto
+                           (append (monkey-items mto) (list worry-bored))))
+      (set-monkey-items! m '()))))
+
+(for ([i (in-inclusive-range 1 20)])
+  (step monkeys 1))
+(apply * (take (sort (for/list ([m monkeys]) (monkey-inspections m)) >) 2))
+;; 54253
+
+(set! monkeys
+  (for/vector ([para (string-split (file->string "day11") "\n\n")])
+    (parse para)))
+
+(for ([i (in-inclusive-range 1 10000)])
+  (step monkeys 2))
+(apply * (take (sort (for/list ([m monkeys]) (monkey-inspections m)) >) 2))
+;; 13119526120