advent-of-code/2022/python/day11.py

126 lines
3.3 KiB
Python
Raw Normal View History

2022-12-11 05:44:32 +00:00
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()