about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--day1155
-rw-r--r--day11.rkt57
2 files changed, 112 insertions, 0 deletions
diff --git a/day11 b/day11
new file mode 100644
index 0000000..41ef4ec
--- /dev/null
+++ b/day11
@@ -0,0 +1,55 @@
+Monkey 0:
+  Starting items: 98, 70, 75, 80, 84, 89, 55, 98
+  Operation: new = old * 2
+  Test: divisible by 11
+    If true: throw to monkey 1
+    If false: throw to monkey 4
+
+Monkey 1:
+  Starting items: 59
+  Operation: new = old * old
+  Test: divisible by 19
+    If true: throw to monkey 7
+    If false: throw to monkey 3
+
+Monkey 2:
+  Starting items: 77, 95, 54, 65, 89
+  Operation: new = old + 6
+  Test: divisible by 7
+    If true: throw to monkey 0
+    If false: throw to monkey 5
+
+Monkey 3:
+  Starting items: 71, 64, 75
+  Operation: new = old + 2
+  Test: divisible by 17
+    If true: throw to monkey 6
+    If false: throw to monkey 2
+
+Monkey 4:
+  Starting items: 74, 55, 87, 98
+  Operation: new = old * 11
+  Test: divisible by 3
+    If true: throw to monkey 1
+    If false: throw to monkey 7
+
+Monkey 5:
+  Starting items: 90, 98, 85, 52, 91, 60
+  Operation: new = old + 7
+  Test: divisible by 5
+    If true: throw to monkey 0
+    If false: throw to monkey 4
+
+Monkey 6:
+  Starting items: 99, 51
+  Operation: new = old + 1
+  Test: divisible by 13
+    If true: throw to monkey 5
+    If false: throw to monkey 2
+
+Monkey 7:
+  Starting items: 98, 94, 59, 76, 51, 65, 75
+  Operation: new = old + 5
+  Test: divisible by 2
+    If true: throw to monkey 3
+    If false: throw to monkey 6
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