feat: add solution 2025/11
This commit is contained in:
15
data/example/2025/11.txt
Normal file
15
data/example/2025/11.txt
Normal file
@@ -0,0 +1,15 @@
|
||||
aaa: you hhh
|
||||
you: bbb ccc
|
||||
bbb: ddd eee
|
||||
ccc: ddd eee fff
|
||||
ddd: ggg
|
||||
eee: out
|
||||
fff: out
|
||||
ggg: out
|
||||
hhh: ccc fff iii
|
||||
iii: out
|
||||
svr: zzz www
|
||||
zzz: dac
|
||||
dac: www out fft
|
||||
fft: out
|
||||
www: out
|
||||
86
src/solution/year_2025/day_11.py
Normal file
86
src/solution/year_2025/day_11.py
Normal file
@@ -0,0 +1,86 @@
|
||||
import collections
|
||||
import functools
|
||||
from typing import Any
|
||||
|
||||
|
||||
def _parse_input(input_data: str) -> tuple[dict[str, int], dict[int, list[int]]]:
|
||||
counter = 0
|
||||
ids = {}
|
||||
|
||||
graph = collections.defaultdict(list)
|
||||
|
||||
for line in input_data.splitlines():
|
||||
node, _neighs = line.split(": ")
|
||||
neighs = _neighs.split()
|
||||
|
||||
if node not in ids:
|
||||
ids[node] = counter
|
||||
counter += 1
|
||||
|
||||
for n in filter(lambda x: x not in ids, neighs):
|
||||
ids[n] = counter
|
||||
counter += 1
|
||||
|
||||
for n in neighs:
|
||||
graph[ids[n]].append(ids[node])
|
||||
|
||||
return ids, graph
|
||||
|
||||
|
||||
def _count_paths(
|
||||
graph: dict[int, list[int]],
|
||||
start: int,
|
||||
end: int,
|
||||
skip: set[int] | None = None,
|
||||
) -> int:
|
||||
if skip is None:
|
||||
skip = set()
|
||||
|
||||
@functools.cache
|
||||
def traverse(node: int):
|
||||
if node in skip:
|
||||
return 0
|
||||
if node == start:
|
||||
return 1
|
||||
return sum(traverse(n) for n in graph[node])
|
||||
|
||||
return traverse(end)
|
||||
|
||||
|
||||
def part_1(input_data: str) -> Any:
|
||||
ids, graph = _parse_input(input_data)
|
||||
print(graph)
|
||||
|
||||
you = ids["you"]
|
||||
out = ids["out"]
|
||||
|
||||
return _count_paths(graph, you, out)
|
||||
|
||||
|
||||
def part_2(input_data: str) -> Any:
|
||||
ids, graph = _parse_input(input_data)
|
||||
|
||||
svr = ids["svr"]
|
||||
out = ids["out"]
|
||||
|
||||
dac = ids["dac"]
|
||||
fft = ids["fft"]
|
||||
|
||||
svr_dac = _count_paths(graph, svr, dac, {out, fft})
|
||||
svr_fft = _count_paths(graph, svr, fft, {out, dac})
|
||||
|
||||
dac_fft = _count_paths(graph, dac, fft, {out})
|
||||
fft_dac = _count_paths(graph, fft, dac, {out})
|
||||
|
||||
dac_out = _count_paths(graph, dac, out, {fft})
|
||||
fft_out = _count_paths(graph, fft, out, {dac})
|
||||
|
||||
return svr_dac * dac_fft * fft_out + svr_fft * fft_dac * dac_out
|
||||
|
||||
|
||||
def test_part_1(example_data):
|
||||
assert part_1(example_data) == 5
|
||||
|
||||
|
||||
def test_part_2(example_data):
|
||||
assert part_2(example_data) == 1
|
||||
Reference in New Issue
Block a user