Skip to content

Instantly share code, notes, and snippets.

@jsbueno
Created December 12, 2022 22:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jsbueno/277d68eaa04beaffdb3c32dd366d764b to your computer and use it in GitHub Desktop.
Save jsbueno/277d68eaa04beaffdb3c32dd366d764b to your computer and use it in GitHub Desktop.
Advent of code 2022, day 11
"""
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