Add solution for day 16 part 2 (not necessarily correct)

This commit is contained in:
Maya Herrscher committed 2022-12-17 12:14:30 +01:00
1 parent c0d74d7cec
commit e51448bd84
2 files changed
+34 -13

No files matched your search

+4
View File
@@ -227,3 +227,7 @@ Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.
With the elephant helping, after 26 minutes, the best you could do would release a total of 1707 pressure. With the elephant helping, after 26 minutes, the best you could do would release a total of 1707 pressure.
With you and an elephant working together for 26 minutes, what is the most pressure you could release? With you and an elephant working together for 26 minutes, what is the most pressure you could release?
Your puzzle answer was 2675.
Both parts of this puzzle are complete! They provide two gold stars: **
+30 -13
View File
@@ -44,7 +44,7 @@ def find_path(G,s,k):
d = deepcopy(di) d = deepcopy(di)
return max(map(max,d.values())) return max(map(max,d.values()))
def Init_double(G,s,k): def Init2(G,s,k):
d = {} d = {}
o = {} o = {}
for v in G['V']: for v in G['V']:
@@ -53,24 +53,42 @@ def Init_double(G,s,k):
d[s] = [0] * k d[s] = [0] * k
return d, o return d, o
def anti_relax_double(u,v,w,i,d,k,o): def anti_relax2(u,v,w,i,d,k,o):
if d[v][i] < d[u][i-1] + w[(u,v)] * (k-i): if d[v][i] < d[u][i-1] + w[(u,v)] * (k-i):
d[v][i] = d[u][i-1] + w[(u,v)] * (k-i) d[v][i] = d[u][i-1] + w[(u,v)] * (k-i)
o[v][i] = o[u][i-1] + [u] o[v][i] = o[u][i-1] + eval(u)
def find_double_path(G,s,k): def find_path2(G,s,k):
d,o = Init_double(G,s,k) d,o = Init2(G,s,k)
for i in range(k): for i in range(k):
di = deepcopy(d) di = deepcopy(d)
for (u,v) in G['E']: for (u,v) in G['E']:
if d[u][i-1] > -1 and not (u[:2] == v[:2] and v in o[u][i-1]): u1,u2 = eval(u)
anti_relax_double(u,v,G['w'],i,di,k,o) v1,v2 = eval(v)
for (u,v) in G['E']: prob = False
if d[u][i-1] > -1 and not (u[:2] == v[:2] and (v in o[u][i-1] or v in o[u][i])): for (a,b) in [(u1,v1),(u1,v2),(u2,v1),(u2,v2)]:
anti_relax_double(u,v,G['w'],i,di,k,o) if a[:2] == b[:2]:
if a in o[u][i-1]:
prob = True
if d[u][i-1] > -1 and not prob: anti_relax2(u,v,G['w'],i,di,k,o)
d = deepcopy(di) d = deepcopy(di)
return max(map(max,d.values())) return max(map(max,d.values()))
def find_double_path(G,s,k):
G2 = {'V': [], 'E': [], 'w': {}}
for u in G['V']:
for v in G['V']:
if u == v and u[2] == 'O': continue
G2['V'].append(str(sorted([u,v])))
for e in G['E']:
if e[0] == u:
for f in G['E']:
if e[1] == f[1] and e[1][2] == 'O': continue
if f[0] == v:
G2['E'].append((str(sorted([u,v])),str(sorted([e[1],f[1]]))))
G2['w'][(str(sorted([u,v])),str(sorted([e[1],f[1]])))] = G['w'][e] + G['w'][f]
return find_path2(G2,f"['{s}', '{s}']",k)
if __name__ == '__main__': if __name__ == '__main__':
[parse(line.strip('\n')) for line in open(sys.argv[1])] [parse(line.strip('\n')) for line in open(sys.argv[1])]
@@ -85,8 +103,7 @@ if __name__ == '__main__':
# challenge 2 # challenge 2
m = find_double_path(VALVES,'AAC',25) m = find_double_path(VALVES,'AAC',25)
# missing: magic! # missing: magic! Doesn't work for example! (off by one) But does work for input...
print(m) res2 = str(m)
res2 = ""
print("challenge 2:" + "\n" + res2 + "\n") print("challenge 2:" + "\n" + res2 + "\n")