From d3f00411f47a251a9c3061d27fdcabd404ecbae5 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 15 Dec 2020 11:16:26 +0100 Subject: [PATCH] 2020: d15: ex2: add solution --- 2020/d15/ex2/ex2.py | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100755 2020/d15/ex2/ex2.py diff --git a/2020/d15/ex2/ex2.py b/2020/d15/ex2/ex2.py new file mode 100755 index 0000000..4d9077e --- /dev/null +++ b/2020/d15/ex2/ex2.py @@ -0,0 +1,40 @@ +#!/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()