advent-of-code/2020/d15/ex2/ex2.py

41 lines
941 B
Python
Raw Normal View History

2020-12-15 11:16:26 +01:00
#!/usr/bin/env python
import itertools
import sys
from collections import defaultdict
from typing import Dict, Iterator, List
def nth(iterable: Iterator[int], n: int) -> int:
return next(itertools.islice(iterable, n, None))
def spoken(spoken: List[int]) -> Iterator[int]:
turn = 0
turns: Dict[int, List[int]] = defaultdict(list)
for last in spoken:
turn += 1
turns[last].append(turn)
yield last
while True:
if len(last_turn := turns[last]) < 2:
last = 0
else:
last = last_turn[-1] - last_turn[-2]
turn += 1
turns[last].append(turn)
yield last
def solve(nums: List[int]) -> int:
return nth(spoken(nums), 30000000 - 1)
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
assert len(input) == 1
print(solve([int(i) for i in input[0].split(",")]))
if __name__ == "__main__":
main()