From 2b11a11c5dbaeabd2e7c1bf703f4d6436e640003 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 11 Dec 2025 09:42:07 +0000 Subject: [PATCH] 2025: d11: ex2: add solution --- 2025/d11/ex2/ex2.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100755 2025/d11/ex2/ex2.py diff --git a/2025/d11/ex2/ex2.py b/2025/d11/ex2/ex2.py new file mode 100755 index 0000000..c3f718f --- /dev/null +++ b/2025/d11/ex2/ex2.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +import functools +import itertools +import math +import sys + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> dict[str, set[str]]: + return { + dev: set(outputs.split(" ")) + for dev, outputs in map(lambda s: s.split(": "), input) + } + + def count_paths(graph: dict[str, set[str]], start: str, end: str) -> int: + @functools.cache + def rec(start: str, end: str) -> int: + if start == end: + return 1 + return sum(rec(n, end) for n in graph.get(start, [])) + + # Input is assured to be a DAG, so a simple recursive count is enough + return rec(start, end) + + graph = parse(input) + return sum( + math.prod(count_paths(graph, a, b) for a, b in itertools.pairwise(path)) + for path in ( + ["svr", "dac", "fft", "out"], + ["svr", "fft", "dac", "out"], + ) + ) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main()