day11
This commit is contained in:
parent
2be2f11856
commit
36b33242be
100
day11.py
Normal file
100
day11.py
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
from collections import defaultdict
|
||||||
|
from math import lcm
|
||||||
|
from tools.aoc import AOCDay
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
class Monkey:
|
||||||
|
def __init__(self, monkey_id: int):
|
||||||
|
self.monkey_id = monkey_id
|
||||||
|
self.items = []
|
||||||
|
self.operation = None
|
||||||
|
self.test = None
|
||||||
|
self.action_true = None
|
||||||
|
self.action_false = None
|
||||||
|
|
||||||
|
def turn(self, part2: bool = False):
|
||||||
|
for _ in range(len(self.items)):
|
||||||
|
item = self.items.pop(0)
|
||||||
|
op, right = self.operation
|
||||||
|
|
||||||
|
if op == "+":
|
||||||
|
item += int(right)
|
||||||
|
elif right == "old":
|
||||||
|
item *= item
|
||||||
|
else:
|
||||||
|
item *= int(right)
|
||||||
|
|
||||||
|
if not part2:
|
||||||
|
item //= 3
|
||||||
|
|
||||||
|
if item % self.test == 0:
|
||||||
|
yield item, self.action_true
|
||||||
|
else:
|
||||||
|
yield item, self.action_false
|
||||||
|
|
||||||
|
|
||||||
|
class Day(AOCDay):
|
||||||
|
inputs = [
|
||||||
|
[
|
||||||
|
(10605, "input11_test"),
|
||||||
|
(98280, "input11"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
(2713310158, "input11_test"),
|
||||||
|
(17673687232, "input11"),
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
def get_monkeys(self) -> list:
|
||||||
|
monkeys = {}
|
||||||
|
current_monkey = None
|
||||||
|
for line in self.getInput():
|
||||||
|
if not line:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if line.startswith("Monkey"):
|
||||||
|
current_monkey = Monkey(int(line[:-1].split(" ")[1]))
|
||||||
|
monkeys[current_monkey.monkey_id] = current_monkey
|
||||||
|
elif line.startswith(" Starting items:"):
|
||||||
|
current_monkey.items = list(map(int, line.split(": ")[1].split(", ")))
|
||||||
|
elif line.startswith(" Operation"):
|
||||||
|
current_monkey.operation = line.split(": ")[1].split(" = ")[1].split(" ")[1:]
|
||||||
|
elif line.startswith(" Test:"):
|
||||||
|
current_monkey.test = int(line.split(" ")[-1])
|
||||||
|
elif line.startswith(" If true:"):
|
||||||
|
current_monkey.action_true = int(line.split(" ")[-1])
|
||||||
|
elif line.startswith(" If false:"):
|
||||||
|
current_monkey.action_false = int(line.split(" ")[-1])
|
||||||
|
else:
|
||||||
|
print("Don't know how to parse '", line, "'")
|
||||||
|
|
||||||
|
return [monkeys[x] for x in sorted(monkeys)]
|
||||||
|
|
||||||
|
def get_monkey_business(self, amount: int = 20, part2: bool = False) -> int:
|
||||||
|
monkeys = self.get_monkeys()
|
||||||
|
monkey_inspects = defaultdict(int)
|
||||||
|
modder = lcm(*[m.test for m in monkeys])
|
||||||
|
|
||||||
|
for _ in range(amount):
|
||||||
|
for monkey in monkeys:
|
||||||
|
for item, target in monkey.turn(part2):
|
||||||
|
monkey_inspects[monkey.monkey_id] += 1
|
||||||
|
if part2:
|
||||||
|
monkeys[target].items.append(item % modder)
|
||||||
|
else:
|
||||||
|
monkeys[target].items.append(item)
|
||||||
|
|
||||||
|
f = sorted(monkey_inspects.values())[-2:]
|
||||||
|
return f[0] * f[1]
|
||||||
|
|
||||||
|
def part1(self) -> Any:
|
||||||
|
return self.get_monkey_business(20, False)
|
||||||
|
|
||||||
|
def part2(self) -> Any:
|
||||||
|
return self.get_monkey_business(10_000, True)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
day = Day(2022, 11)
|
||||||
|
day.run(verbose=True)
|
||||||
55
inputs/input11
Normal file
55
inputs/input11
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
Monkey 0:
|
||||||
|
Starting items: 56, 52, 58, 96, 70, 75, 72
|
||||||
|
Operation: new = old * 17
|
||||||
|
Test: divisible by 11
|
||||||
|
If true: throw to monkey 2
|
||||||
|
If false: throw to monkey 3
|
||||||
|
|
||||||
|
Monkey 1:
|
||||||
|
Starting items: 75, 58, 86, 80, 55, 81
|
||||||
|
Operation: new = old + 7
|
||||||
|
Test: divisible by 3
|
||||||
|
If true: throw to monkey 6
|
||||||
|
If false: throw to monkey 5
|
||||||
|
|
||||||
|
Monkey 2:
|
||||||
|
Starting items: 73, 68, 73, 90
|
||||||
|
Operation: new = old * old
|
||||||
|
Test: divisible by 5
|
||||||
|
If true: throw to monkey 1
|
||||||
|
If false: throw to monkey 7
|
||||||
|
|
||||||
|
Monkey 3:
|
||||||
|
Starting items: 72, 89, 55, 51, 59
|
||||||
|
Operation: new = old + 1
|
||||||
|
Test: divisible by 7
|
||||||
|
If true: throw to monkey 2
|
||||||
|
If false: throw to monkey 7
|
||||||
|
|
||||||
|
Monkey 4:
|
||||||
|
Starting items: 76, 76, 91
|
||||||
|
Operation: new = old * 3
|
||||||
|
Test: divisible by 19
|
||||||
|
If true: throw to monkey 0
|
||||||
|
If false: throw to monkey 3
|
||||||
|
|
||||||
|
Monkey 5:
|
||||||
|
Starting items: 88
|
||||||
|
Operation: new = old + 4
|
||||||
|
Test: divisible by 2
|
||||||
|
If true: throw to monkey 6
|
||||||
|
If false: throw to monkey 4
|
||||||
|
|
||||||
|
Monkey 6:
|
||||||
|
Starting items: 64, 63, 56, 50, 77, 55, 55, 86
|
||||||
|
Operation: new = old + 8
|
||||||
|
Test: divisible by 13
|
||||||
|
If true: throw to monkey 4
|
||||||
|
If false: throw to monkey 0
|
||||||
|
|
||||||
|
Monkey 7:
|
||||||
|
Starting items: 79, 58
|
||||||
|
Operation: new = old + 6
|
||||||
|
Test: divisible by 17
|
||||||
|
If true: throw to monkey 1
|
||||||
|
If false: throw to monkey 5
|
||||||
27
inputs/input11_test
Normal file
27
inputs/input11_test
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
Monkey 0:
|
||||||
|
Starting items: 79, 98
|
||||||
|
Operation: new = old * 19
|
||||||
|
Test: divisible by 23
|
||||||
|
If true: throw to monkey 2
|
||||||
|
If false: throw to monkey 3
|
||||||
|
|
||||||
|
Monkey 1:
|
||||||
|
Starting items: 54, 65, 75, 74
|
||||||
|
Operation: new = old + 6
|
||||||
|
Test: divisible by 19
|
||||||
|
If true: throw to monkey 2
|
||||||
|
If false: throw to monkey 0
|
||||||
|
|
||||||
|
Monkey 2:
|
||||||
|
Starting items: 79, 60, 97
|
||||||
|
Operation: new = old * old
|
||||||
|
Test: divisible by 13
|
||||||
|
If true: throw to monkey 1
|
||||||
|
If false: throw to monkey 3
|
||||||
|
|
||||||
|
Monkey 3:
|
||||||
|
Starting items: 74
|
||||||
|
Operation: new = old + 3
|
||||||
|
Test: divisible by 17
|
||||||
|
If true: throw to monkey 0
|
||||||
|
If false: throw to monkey 1
|
||||||
Loading…
Reference in New Issue
Block a user