Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from pathlib import Path
- from typing import Sequence
- from collections import deque, Counter
- from itertools import islice
- def parse(input: str) -> list[int]:
- return [int(n) for n in input.splitlines()]
- def step(secret: int) -> int:
- secret = (secret ^ (secret * 64)) % 16777216
- secret = (secret ^ secret // 32) % 16777216
- secret = (secret ^ (secret * 2048)) % 16777216
- return secret
- def nth_secret(secret: int, n: int) -> int:
- for _ in range(n):
- secret = step(secret)
- return secret
- def part1(data: list[int], steps: int) -> int:
- return sum(nth_secret(secret, steps) for secret in data)
- TEST = parse(Path("input/day22-test.txt").read_text())
- assert part1(TEST, 2000) == 37327623
- INPUT = parse(Path("input/day22.txt").read_text())
- part1_total = part1(INPUT, 2000)
- print(f"{part1_total=:,}") # 14,726,157,693
- def sliding_window(iterable, n):
- "Collect data into overlapping fixed-length chunks or blocks."
- # sliding_window('ABCDEFG', 4) → ABCD BCDE CDEF DEFG
- iterator = iter(iterable)
- window = deque(islice(iterator, n - 1), maxlen=n)
- for x in iterator:
- window.append(x)
- yield tuple(window)
- def prices(secret: int, steps: int = 2000) -> Sequence[tuple[int, int]]:
- last = secret % 10
- for i in range(steps):
- secret = step(secret)
- s = secret % 10
- yield s, s - last
- last = s
- def sequences(secret: int, steps: int = 2000) -> Sequence[tuple[str, int]]:
- for w in sliding_window(prices(secret, steps), 4):
- key = f"{w[0][1]}{w[1][1]}{w[2][1]}{w[3][1]}"
- value = w[3][0]
- yield key, value
- def sell_dict(secret: int, steps: int = 2000) -> dict[str, int]:
- seq = list(sequences(secret, steps))
- return dict(reversed(seq))
- def part2(data: list[str]) -> int:
- bananas = Counter()
- for secret in data:
- d = sell_dict(secret)
- bananas.update(d)
- # print(bananas.most_common(1))
- return bananas.most_common(1)[0][1]
- assert part2([1, 2, 3, 2024]) == 23
- part2_total = part2(INPUT)
- print(f"{part2_total=:,}") # 1,614
Advertisement
Add Comment
Please, Sign In to add comment