def solve2(ns, phases): | def solve2(ns, phases): | ||||
feedback = [] | |||||
iter_phases = iter(phases) | |||||
feedback = [0] | |||||
iter_feed = iter(feedback) | iter_feed = iter(feedback) | ||||
loop = cycle([ | |||||
compute(ns, chain([next(iter_phases), 0], iter_feed)), | |||||
compute(ns, chain([next(iter_phases)], iter_feed)), | |||||
compute(ns, chain([next(iter_phases)], iter_feed)), | |||||
compute(ns, chain([next(iter_phases)], iter_feed)), | |||||
compute(ns, chain([next(iter_phases)], iter_feed)), | |||||
]) | |||||
loop = cycle(compute(ns, chain([phase], iter_feed)) for phase in phases) | |||||
try: | try: | ||||
for machine in loop: | for machine in loop: | ||||
feedback.append(next(machine)) | feedback.append(next(machine)) |
nX, _ = simulate(text, axes=slice(0, 1)) | nX, _ = simulate(text, axes=slice(0, 1)) | ||||
nY, _ = simulate(text, axes=slice(1, 2)) | nY, _ = simulate(text, axes=slice(1, 2)) | ||||
nZ, _ = simulate(text, axes=slice(2, 3)) | nZ, _ = simulate(text, axes=slice(2, 3)) | ||||
gcds = {gcd(p, q) for p, q in itertools.combinations([nX, nY, nZ], 2)} | |||||
lcm = functools.reduce(int.__mul__, gcds) | |||||
print(nX * nY * nZ // lcm) | |||||
lcm = functools.reduce(lambda a, b: a * b // gcd(a, b), [nX, nY, nZ]) | |||||
print(lcm) |