#!/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)