day 11 part 2

This commit is contained in:
magical 2025-12-11 05:58:59 +00:00
parent 1b9a66f49b
commit 21a8457a32

View File

@ -8,29 +8,66 @@ def solve(input):
V.append(v) V.append(v)
G[v] = parts G[v] = parts
extra = [e for edges in G.values() for e in edges if e not in V] sinks = [e for edges in G.values() for e in edges if e not in V]
V += extra V += sinks
for v in extra: for v in sinks:
G[v] = [] G[v] = []
# reversed graph
R = {}
for v, E in G.items():
for e in E:
R.setdefault(e, []).append(v)
Q = [(0,'you')] # topological sort
dist = {} # T is an order of vertices such that each vertex is
paths = {v:0 for v in V} # listed _after_ all the vertices connected to its incoming edges.
paths['you'] = 1 T = []
while Q: seen = set()
cost, v = heapq.heappop(Q) def visit(v):
if v in dist: if v not in seen:
continue seen.add(v)
dist[v] = cost for e in R.get(v,()):
for e in G[v]: visit(e)
if e not in dist: T.append(v)
heapq.heappush(Q, (cost+1, e))
paths[e] += paths[v]
print(paths)
print(paths['out'])
visit('out')
#T.reverse()
#print(T)
def paths(start,end):
Q = [(0,start)]
seen = set()
paths = {v:0 for v in V}
paths[start] = 1
for v in T:
if v in seen:
continue
seen.add(v)
for e in G[v]:
paths[e] += paths[v]
#print(paths)
return paths[end]
if 'you' in G:
# Part 1:
# find all paths from you -> out
print(paths('you', 'out'))
if 'svr' in G:
# Part 2: find all paths that pass through
# svr -> fft -> dac -> out, or
# svr -> dac -> fft -> out.
sf = paths('svr', 'fft')
sd = paths('svr', 'dac')
fd = paths('fft', 'dac')
df = paths('dac', 'fft')
do = paths('dac', 'out')
fo = paths('fft', 'out')
print(sf*fd*do + sd*df*fo)
solve("sample") solve("sample")
solve("sample2")
solve("input") solve("input")