From 290ac25ea167e77cae0f80971a207f157fa0b283 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 9 May 2025 23:53:17 +0100 Subject: [PATCH] 2017: d15: ex1: add solution --- 2017/d15/ex1/ex1.py | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100755 2017/d15/ex1/ex1.py diff --git a/2017/d15/ex1/ex1.py b/2017/d15/ex1/ex1.py new file mode 100755 index 0000000..24bd9ba --- /dev/null +++ b/2017/d15/ex1/ex1.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python + +import functools +import itertools +import sys +from collections.abc import Iterator + + +def solve(input: str) -> int: + def parse(input: str) -> tuple[int, int]: + a, b = input.splitlines() + return int(a.split()[-1]), int(b.split()[-1]) + + def generate(seed: int, factor: int) -> int: + seed *= factor + return seed % 2147483647 + + def judge(a: int, b: int) -> bool: + mask = (1 << 16) - 1 + return (a & mask) == (b & mask) + + def iter_judgements(seed_a: int, seed_b: int) -> Iterator[bool]: + generate_a = functools.partial(generate, factor=16807) + generate_b = functools.partial(generate, factor=48271) + + while True: + seed_a, seed_b = generate_a(seed_a), generate_b(seed_b) + yield judge(seed_a, seed_b) + + seed_a, seed_b = parse(input) + return sum(itertools.islice(iter_judgements(seed_a, seed_b), 40000000)) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main()