Day 12
This commit is contained in:
26
day12/input.txt
Normal file
26
day12/input.txt
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
CV-mk
|
||||||
|
gm-IK
|
||||||
|
sk-gm
|
||||||
|
ca-sk
|
||||||
|
sx-mk
|
||||||
|
gm-start
|
||||||
|
sx-ca
|
||||||
|
kt-sk
|
||||||
|
ca-VS
|
||||||
|
kt-ml
|
||||||
|
kt-ca
|
||||||
|
mk-IK
|
||||||
|
end-sx
|
||||||
|
end-sk
|
||||||
|
gy-sx
|
||||||
|
end-ca
|
||||||
|
ca-ml
|
||||||
|
gm-CV
|
||||||
|
sx-kt
|
||||||
|
start-CV
|
||||||
|
IK-start
|
||||||
|
CV-kt
|
||||||
|
ml-mk
|
||||||
|
ml-CV
|
||||||
|
ml-gm
|
||||||
|
ml-IK
|
||||||
27
day12/part1.py
Normal file
27
day12/part1.py
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
|
lines = (x.strip() for x in open("input.txt"))
|
||||||
|
paths = defaultdict(set)
|
||||||
|
stored_sum = {}
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
a, b = line.split("-")
|
||||||
|
paths[a].add(b)
|
||||||
|
paths[b].add(a)
|
||||||
|
|
||||||
|
|
||||||
|
def visit(node, visited):
|
||||||
|
store_key = hash((node, frozenset(visited)))
|
||||||
|
if node == 'end':
|
||||||
|
return 1
|
||||||
|
elif store_key not in stored_sum:
|
||||||
|
stored_sum[store_key] = sum(
|
||||||
|
visit(nxt, visited.union([nxt]) if nxt != nxt.upper() else visited)
|
||||||
|
for nxt in paths[node].difference(visited)
|
||||||
|
)
|
||||||
|
return stored_sum[store_key]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print(visit('start', {'start'}))
|
||||||
29
day12/part2.py
Normal file
29
day12/part2.py
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
|
lines = (x.strip() for x in open("input.txt"))
|
||||||
|
paths = defaultdict(set)
|
||||||
|
stored_sum = {}
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
a, b = line.split("-")
|
||||||
|
paths[a].add(b)
|
||||||
|
paths[b].add(a)
|
||||||
|
|
||||||
|
|
||||||
|
def visit(node, visited):
|
||||||
|
store_key = hash((node, frozenset(hash((k, v)) for k, v in visited.items())))
|
||||||
|
if node == 'end':
|
||||||
|
return 1
|
||||||
|
elif store_key not in stored_sum:
|
||||||
|
has_twice = max(visited.values()) > 1
|
||||||
|
stored_sum[store_key] = sum(
|
||||||
|
visit(nxt, {**visited, nxt: visited.get(nxt, 0) + 1} if nxt != nxt.upper() else visited)
|
||||||
|
for nxt in paths[node].difference(
|
||||||
|
set(k for k, v in visited.items() if v >= (1 if has_twice else 2) or (v == 1 and k == 'start'))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return stored_sum[store_key]
|
||||||
|
|
||||||
|
|
||||||
|
print(visit('start', {'start': 1}))
|
||||||
Reference in New Issue
Block a user