58 lines
1.5 KiB
Python
58 lines
1.5 KiB
Python
from collections import deque
|
|
|
|
with open("input") as f:
|
|
data = f.read().strip().split("\n")
|
|
data = list(map(lambda x: list(map(int, x.split(","))), data))
|
|
|
|
|
|
def make_field(data, w=71, h=71):
|
|
field = [["."] * (w + 2) for _ in range(h + 2)]
|
|
for i, j in data:
|
|
field[i + 1][j + 1] = "#"
|
|
for i in range(w + 2):
|
|
field[0][i] = "#"
|
|
field[h + 1][i] = "#"
|
|
for i in range(h + 2):
|
|
field[i][0] = "#"
|
|
field[i][w + 1] = "#"
|
|
return field
|
|
|
|
|
|
def part1(field):
|
|
w = len(field[0])
|
|
h = len(field)
|
|
scores = [[float("+inf")] * w for _ in range(h)]
|
|
scores[1][1] = 0
|
|
q = deque([(1, 2), (2, 1)])
|
|
d = [(1, 0), (0, 1), (-1, 0), (0, -1)]
|
|
while q:
|
|
i, j = q.popleft()
|
|
if scores[i][j] == float("+inf") and field[i][j] != "#":
|
|
m = min(scores[i + di][j + dj] for di, dj in d)
|
|
scores[i][j] = m + 1
|
|
for di, dj in d:
|
|
if (
|
|
scores[i + di][j + dj] == float("+inf")
|
|
and field[i + di][j + dj] != "#"
|
|
):
|
|
q.append((i + di, j + dj))
|
|
|
|
return scores
|
|
|
|
|
|
def print_field(scores, field):
|
|
for i, row in enumerate(field):
|
|
for j, cell in enumerate(row):
|
|
if cell == "#":
|
|
print("#", end="")
|
|
elif scores[i][j] == float("+inf"):
|
|
print("i", end="")
|
|
else:
|
|
print(".", end="")
|
|
print()
|
|
|
|
|
|
field = make_field(data[:1024])
|
|
# print_field(part1(field), field)
|
|
print(part1(field)[-2][-2])
|