57 lines
1.5 KiB
Python
57 lines
1.5 KiB
Python
#!/usr/bin/env python3
|
|
|
|
from collections import defaultdict
|
|
|
|
initial_secrets = []
|
|
|
|
with open("day22") as f:
|
|
initial_secrets = list(map(int, f))
|
|
|
|
def calc_secrets(init: int, cnt: int) -> list[int]:
|
|
sec = init
|
|
col = [init]
|
|
for _ in range(cnt):
|
|
sec = (sec ^ (sec * 64)) % 16777216
|
|
sec = (sec ^ (sec // 32)) % 16777216
|
|
sec = (sec ^ (sec * 2048)) % 16777216
|
|
col.append(sec)
|
|
return col
|
|
|
|
# part 1
|
|
res = 0
|
|
for init in initial_secrets:
|
|
secrets = calc_secrets(init, 2000)
|
|
res += secrets[-1]
|
|
|
|
print(res)
|
|
|
|
# part 2
|
|
def calc_prices(init: int, cnt: int) -> list[int]:
|
|
return [s%10 for s in calc_secrets(init, cnt)]
|
|
|
|
def calc_diffs(prices: list[int]) -> list[int]:
|
|
return [0] + [b-a for a,b in zip(prices, prices[1:])]
|
|
|
|
def calc_seq_price(prices, diffs):
|
|
seq_price = {}
|
|
for i in range(0,len(diffs)-4):
|
|
seq = (diffs[i], diffs[i+1], diffs[i+2], diffs[i+3])
|
|
price = prices[i+3]
|
|
|
|
if seq not in seq_price:
|
|
seq_price[seq] = price
|
|
|
|
return seq_price
|
|
|
|
|
|
all_prices = [calc_prices(init, 2000) for init in initial_secrets]
|
|
all_diffs = [calc_diffs(prices) for prices in all_prices]
|
|
all_seq_prices = [calc_seq_price(prices, diffs) for prices,diffs in zip(all_prices, all_diffs)]
|
|
|
|
seq_price_total = defaultdict(int)
|
|
for seq_price in all_seq_prices:
|
|
for s,p in seq_price.items():
|
|
seq_price_total[s] += p
|
|
|
|
max_seq, max_price = sorted(seq_price_total.items(), key=lambda x: x[1], reverse=True)[0]
|
|
print(max_price)
|