Day 15, probably not optimised at all...
This commit is contained in:
parent
6ac2daf309
commit
4019cb1a36
53
2021/day15.py
Normal file
53
2021/day15.py
Normal file
|
@ -0,0 +1,53 @@
|
|||
from collections import defaultdict
|
||||
from math import inf
|
||||
|
||||
with open("input15.txt") as f:
|
||||
lines = [line.rstrip() for line in f]
|
||||
plan = [list(map(int, line)) for line in lines]
|
||||
dim = len(plan)
|
||||
ndim = dim * 5
|
||||
|
||||
|
||||
def solve(dimension, risk_f): # bellman-ford from wikipedia looool
|
||||
dists = defaultdict(lambda: inf)
|
||||
preds = defaultdict(lambda: None)
|
||||
dists[(0, 0)] = 0
|
||||
changed = True
|
||||
while changed:
|
||||
changed = False
|
||||
for x in range(dimension):
|
||||
for y in range(dimension):
|
||||
p = (x, y)
|
||||
dist = dists[p]
|
||||
near = []
|
||||
if x > 0:
|
||||
near.append((x - 1, y))
|
||||
if x < dimension - 1:
|
||||
near.append((x + 1, y))
|
||||
if y > 0:
|
||||
near.append((x, y - 1))
|
||||
if y < dimension - 1:
|
||||
near.append((x, y + 1))
|
||||
for n in near:
|
||||
nx, ny = n
|
||||
risk = risk_f(nx, ny)
|
||||
if dist + risk < dists[n]:
|
||||
changed = True
|
||||
dists[n] = dist + risk
|
||||
preds[n] = p
|
||||
return dists
|
||||
|
||||
|
||||
def risk_f1(nx, ny):
|
||||
return plan[nx][ny]
|
||||
|
||||
|
||||
def risk_f2(nx, ny):
|
||||
risk = (plan[nx % dim][ny % dim] + nx // dim + ny // dim)
|
||||
while risk >= 10:
|
||||
risk -= 9
|
||||
return risk
|
||||
|
||||
|
||||
print(solve(dim, risk_f1)[(dim - 1, dim - 1)])
|
||||
print(solve(ndim, risk_f2)[(ndim - 1, ndim - 1)])
|
Loading…
Reference in a new issue