Created
December 12, 2022 22:35
-
-
Save jsbueno/277d68eaa04beaffdb3c32dd366d764b to your computer and use it in GitHub Desktop.
Advent of code 2022, day 11
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
SPOILER ALERT | |
As usual, these are snippets used to get the answer in interactive mode, not | |
a self-contained interactive program. | |
""" | |
class Monkey: | |
monkeys = [] | |
def __init__(self, text): | |
self.__class__.monkeys.append(self) | |
self.name = len(self.__class__.monkeys) - 1 | |
self.text = text | |
self.items = deque() | |
self.parse() | |
self.inspected = 0 | |
self.rounds = 0 | |
def parse(self): | |
lines = self.text.splitlines() | |
self.items.extend(Item((x:=int(item)), x) for item in lines[1].split(": ")[-1].split(",")) | |
self.item_line = lines[1] | |
self.test_factor = int(lines[3].split("by ")[1]) | |
self.optokens = lines[2].split("= ")[1].split() | |
self.targets = tuple(int(lines[i].split("monkey ")[1]) for i in (4,5)) | |
def operate(self, item): | |
op1, opertext, op2 = self.optokens | |
op1 = int(op1) if op1.isdigit() else item.level | |
op2 = int(op2) if op2.isdigit() else item.level | |
item.level = (mul, add)[opertext=="+"](op1, op2) // 3 | |
def target_mod(self, item): | |
return item.level % self.test_factor != 0 | |
def step(self, item): | |
self.operate(item) | |
self.inspected += 1 | |
self.monkeys[self.targets[self.target_mod(item)]].items.append(item) | |
def turn(self): | |
if not hasattr(self.__class__, "factor"): | |
Monkey.factor = prod(m.test_factor for m in self.__class__.monkeys) | |
while self.items: | |
self.step(self.items.popleft()) | |
self.rounds += 1 | |
def __eq__(self, other): | |
return self.inspected == other.inspected | |
def __gt__(self, other): | |
return self.inspected > other.inspected | |
def __repr__(self): | |
return self.text + f"\ncurrent items: {self.items}\n inspected:{self.inspected}\nrounds: {self.rounds}" | |
@classmethod | |
def load(cls, data): | |
if hasattr(Monkey, "factor"): | |
del Monkey.factor | |
Monkey.monkeys[:] = [] | |
for mt in data.split("\n\n"): | |
cls(mt) | |
@dataclass | |
class Item: | |
name: int | |
level: int | |
@property | |
def factor(self): | |
return Monkey.factor | |
def add(self, n): | |
self.level += n | |
def mul(self, n): | |
self.level = (self.level * n) % self.factor | |
class M2(Monkey): | |
def operate(self, item): | |
op1, opertext, op2 = self.optokens | |
#op1 = int(op1) if op1.isdigit() else item.data[self.test_factor] | |
op2 = int(op2) if op2.isdigit() else item.level #item.data[self.test_factor] | |
getattr(item, ("mul", "add")[opertext=="+"])(op2) | |
def round(n = 1): | |
for i in range(n): | |
for monkey in Monkey.monkeys: | |
monkey.turn() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment