Roderic Day 2 vuotta sitten
vanhempi
commit
c5dde409ac
1 muutettua tiedostoa jossa 41 lisäystä ja 0 poistoa
  1. +41
    -0
      y2022/p11.py

+ 41
- 0
y2022/p11.py Näytä tiedosto

@@ -0,0 +1,41 @@
import functools
import operator
import re


class Monkey:

def __init__(self, description):
relevant = re.findall(r'\d+|old|\*|\+', description)
parsed = [int(n) if n.isdigit() else n for n in relevant]
self.idx, *self.items, _, op, op_arg, self.div, aa, bb = parsed
op = {'*': operator.mul, '+': operator.add}[op]
self.fn = lambda x: op(x, x if op_arg == 'old' else op_arg)
self.target = lambda x: aa if x % self.div == 0 else bb

def __repr__(self):
return f'Monkey_{self.idx}({self.items})'


def play(monkeys, n_rounds, act):
counts = [0 for _ in monkeys]
for _ in range(n_rounds):
for monkey in monkeys:
while monkey.items:
counts[monkey.idx] += 1
item = act(monkey, monkey.items.pop())
monkeys[monkey.target(item)].items.append(item)
yy, zz = sorted(counts)[-2:]
return yy * zz


text = open(0).read()

monkeys = [Monkey(descr) for descr in text.strip().split('\n\n')]
ans1 = play(monkeys, 20, lambda m, i: int(m.fn(i) / 3))
print(ans1)

monkeys = [Monkey(descr) for descr in text.strip().split('\n\n')]
lim = functools.reduce(operator.mul, [m.div for m in monkeys])
ans2 = play(monkeys, 10_000, lambda m, i: m.fn(i) % lim)
print(ans2)

Loading…
Peruuta
Tallenna