#!/usr/bin/env python3 from useful import * def monkey(p): ls = p.strip().split('\n') op = ls[2].strip().split()[4] return [op, *[numbers(l) for l in ls[1:3]], *[numbers(l)[0] for l in ls[3:]], 0] ps = pgphs(open(0).read()) ms = [monkey(p) for p in ps] ns = [monkey(p) for p in ps] def op(base, leop, vals): if not vals: # happens once in our input; is 'old * old' return base * base return base * vals[0] if leop == '*' else base + vals[0] def rnd(): for m in ms: a = m[1] m[6] += len(a) for i in a: i = op(i, m[0], m[2]) // 3 ms[m[4 if not (i % m[3]) else 5]][1].append(i) m[1] = [] common = np.prod([m[3] for m in ms]) def rnd2(): for m in ns: a = m[1] m[6] += len(a) for i in a: i = op(i, m[0], m[2]) % common ns[m[4 if not (i % m[3]) else 5]][1].append(i) m[1] = [] for i in range(20): rnd() print(np.prod(sorted(m[6] for m in ms)[-2:])) for i in range(10000): rnd2() print(np.prod(sorted(m[6] for m in ns)[-2:]))