diff options
-rw-r--r-- | day11 | 55 | ||||
-rw-r--r-- | day11.rkt | 57 |
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 |