126 lines
3.3 KiB
Python
126 lines
3.3 KiB
Python
import shared
|
|
from scanf import scanf
|
|
import matrix
|
|
from dataclasses import dataclass
|
|
from typing import Callable
|
|
import operator
|
|
|
|
|
|
@dataclass
|
|
class Monkey:
|
|
number: int
|
|
items: list
|
|
div: int
|
|
t: int
|
|
f: int
|
|
by: int
|
|
op: operator
|
|
inspect_count: int = 0
|
|
|
|
|
|
|
|
def load_monkeys(lines):
|
|
monkeys = []
|
|
count = 0
|
|
for line in lines:
|
|
if line.lstrip().startswith("Starting"):
|
|
items = list(map(int, line.split(": ")[-1].split(",")))
|
|
elif line.lstrip().startswith("Operation"):
|
|
op = line.split(": ")[-1]
|
|
try:
|
|
by = int(line.split(" ")[-1])
|
|
except ValueError:
|
|
by = None # know None means by self
|
|
if '*' in op:
|
|
operand = operator.mul
|
|
elif '+' in op:
|
|
operand = operator.add
|
|
elif line.lstrip().startswith("Test"):
|
|
div = int(line.split(" ")[-1])
|
|
elif line.lstrip().startswith("If true"):
|
|
true = int(line.split(" ")[-1])
|
|
elif line.lstrip().startswith("If false"):
|
|
false = int(line.split(" ")[-1])
|
|
monkey = Monkey(
|
|
number=count,
|
|
items=items,
|
|
op=operand,
|
|
by=by,
|
|
div=div,
|
|
t=true,
|
|
f=false
|
|
)
|
|
monkeys.append(monkey)
|
|
count+=1
|
|
return monkeys
|
|
|
|
def part1(lines):
|
|
monkeys = load_monkeys(lines)
|
|
for monkey in monkeys:
|
|
print(monkey)
|
|
|
|
for current_round in range(20): # TODO: WHILE
|
|
for monkey in monkeys:
|
|
for item in monkey.items:
|
|
monkey.inspect_count += 1
|
|
if monkey.by is None:
|
|
# Self
|
|
item = monkey.op(item, item)
|
|
else:
|
|
item = monkey.op(item, monkey.by)
|
|
print(item,monkey.by, monkey.op)
|
|
item = item // 3
|
|
print(item)
|
|
if item % monkey.div == 0:
|
|
to = monkey.t
|
|
else:
|
|
to = monkey.f
|
|
monkeys[to].items.append(item)
|
|
monkey.items = []
|
|
print("-----current round", current_round)
|
|
|
|
counts = list(sorted([monkey.inspect_count for monkey in monkeys]))
|
|
print(counts)
|
|
total = counts[-1] * counts[-2]
|
|
print(total)
|
|
|
|
|
|
|
|
|
|
def part2(lines):
|
|
monkeys = load_monkeys(lines)
|
|
for monkey in monkeys:
|
|
print(monkey)
|
|
|
|
for current_round in range(10000): # TODO: WHILE
|
|
for monkey in monkeys:
|
|
for item in monkey.items:
|
|
monkey.inspect_count += 1
|
|
if monkey.by is None:
|
|
# Self
|
|
item = monkey.op(item, item)
|
|
else:
|
|
item = monkey.op(item, monkey.by)
|
|
if item % monkey.div == 0:
|
|
to = monkey.t
|
|
else:
|
|
to = monkey.f
|
|
monkeys[to].items.append(item)
|
|
monkey.items = []
|
|
print("-----current round", current_round)
|
|
|
|
counts = list(sorted([monkey.inspect_count for monkey in monkeys]))
|
|
print(counts)
|
|
total = counts[-1] * counts[-2]
|
|
print(total)
|
|
|
|
|
|
def main():
|
|
rows = [row for row in shared.load(11)]
|
|
#part1(rows)
|
|
part2(rows)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|