57 lines
944 B
Python
57 lines
944 B
Python
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()))
|