From e0bae5d69b7e7a231b8e859ac600a1e49ae1c4f3 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 9 May 2025 23:53:28 +0100 Subject: [PATCH] 2017: d15: ex2: add solution --- 2017/d15/ex2/ex2.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100755 2017/d15/ex2/ex2.py diff --git a/2017/d15/ex2/ex2.py b/2017/d15/ex2/ex2.py new file mode 100755 index 0000000..17eab8e --- /dev/null +++ b/2017/d15/ex2/ex2.py @@ -0,0 +1,43 @@ +#!/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, criteria: int) -> int: + while True: + seed *= factor + seed %= 2147483647 + if (seed % criteria) == 0: + return seed + + 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, criteria=4) + generate_b = functools.partial(generate, factor=48271, criteria=8) + + 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), 5000000)) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main()