No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

42 líneas
1.3KB

  1. import functools
  2. import operator
  3. import re
  4. class Monkey:
  5. def __init__(self, description):
  6. relevant = re.findall(r'\d+|old|\*|\+', description)
  7. parsed = [int(n) if n.isdigit() else n for n in relevant]
  8. self.idx, *self.items, _, op, op_arg, self.div, aa, bb = parsed
  9. op = {'*': operator.mul, '+': operator.add}[op]
  10. self.fn = lambda x: op(x, x if op_arg == 'old' else op_arg)
  11. self.target = lambda x: aa if x % self.div == 0 else bb
  12. def __repr__(self):
  13. return f'Monkey_{self.idx}({self.items})'
  14. def play(monkeys, n_rounds, act):
  15. counts = [0 for _ in monkeys]
  16. for _ in range(n_rounds):
  17. for monkey in monkeys:
  18. while monkey.items:
  19. counts[monkey.idx] += 1
  20. item = act(monkey, monkey.items.pop())
  21. monkeys[monkey.target(item)].items.append(item)
  22. yy, zz = sorted(counts)[-2:]
  23. return yy * zz
  24. text = open(0).read()
  25. monkeys = [Monkey(descr) for descr in text.strip().split('\n\n')]
  26. ans1 = play(monkeys, 20, lambda m, i: int(m.fn(i) / 3))
  27. print(ans1)
  28. monkeys = [Monkey(descr) for descr in text.strip().split('\n\n')]
  29. lim = functools.reduce(operator.mul, [m.div for m in monkeys])
  30. ans2 = play(monkeys, 10_000, lambda m, i: m.fn(i) % lim)
  31. print(ans2)