18.1
This commit is contained in:
+57
@@ -0,0 +1,57 @@
|
||||
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])
|
||||
Reference in New Issue
Block a user