aoc2024/day22.py
2024-12-22 10:22:14 +01:00

61 lines
1.7 KiB
Python

from collections import defaultdict
from tools.aoc import AOCDay
from typing import Any
def get_next_secret(secret: int, steps: int = 1) -> int:
for _ in range(steps):
new_secret = secret * 64
secret = (secret ^ new_secret) % 16777216
new_secret = secret // 32
secret = (secret ^ new_secret) % 16777216
new_secret = secret * 2048
secret = (secret ^ new_secret) % 16777216
return secret
class Day(AOCDay):
inputs = [
[
(37327623, "input22_test"),
(14869099597, "input22"),
],
[
(23, "input22_test2"),
(1717, "input22"),
],
]
def parse_input(self) -> list[int]:
return self.getInput(return_type=int)
def part1(self) -> Any:
return sum(get_next_secret(x, 2000) for x in self.parse_input())
def part2(self) -> Any:
sequences = defaultdict(int)
max_bananas = 0
for secret in self.parse_input():
sequence = (-10, -10, -10, -10)
seen = set()
for i in range(2000):
next_secret = get_next_secret(secret)
price = next_secret % 10
diff = price - secret % 10
secret = next_secret
sequence = sequence[-3:] + (diff,)
if sequence in seen or i < 4:
continue
seen.add(sequence)
sequences[sequence] += price
if sequences[sequence] > max_bananas:
max_bananas = sequences[sequence]
return max_bananas
if __name__ == "__main__":
day = Day(2024, 22)
day.run(verbose=True)