from lib import get_data from lib import ints from collections import defaultdict data = get_data(__file__) def secret(x): x ^= x * 64 x %= 16777216 x ^= x // 32 x %= 16777216 x ^= x * 2048 x %= 16777216 return x def slice(xs, n): return [slice for slice in zip(*[xs[i:] for i in range(n)])] codes = defaultdict(int) def int_seq(x): xs = [] for _ in range(2000): xs.append(x % 10) x = secret(x) ds = [a - b for a, b in zip(xs[1:], xs)] seen = set() for s in slice(list(zip(xs[1:], ds)), 4): code = tuple([e[1] for e in s]) v = s[-1][0] if not code in seen: codes[code] += v seen.add(code) for line in data.splitlines(): (x,) = ints(line) s = 0 for line in data.splitlines(): (x,) = ints(line) int_seq(x) for _ in range(2000): x = secret(x) s += x print(s) print(max(codes.values()))