Skip to content

Commit 4344e7b

Browse files
committed
Day 15 Python solutions
1 parent b00bf95 commit 4344e7b

File tree

2 files changed

+131
-0
lines changed

2 files changed

+131
-0
lines changed

15-1.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#!/usr/bin/env python
2+
3+
import numpy
4+
5+
class Map:
6+
def __init__(self, input):
7+
self.size = len(input)
8+
self.map = numpy.zeros((self.size, self.size), dtype=numpy.uint)
9+
self.risk = numpy.empty((self.size, self.size), dtype=numpy.uint)
10+
self.risk.fill(pow(2, 32) - 1)
11+
12+
for row in range(len(input)):
13+
for col in range(len(input)):
14+
self.map[row, col] = int(input[row][col])
15+
16+
def find_risk(self):
17+
queue = []
18+
for row in range(self.size):
19+
for col in range(self.size):
20+
queue.append((row, col))
21+
self.risk[0, 0] = 0
22+
23+
while len(queue) > 0:
24+
min_risk = pow(2, 32)
25+
min_coords = (0, 0)
26+
min_index = 0
27+
for index in range(len(queue)):
28+
risk = self.risk[queue[index][0], queue[index][1]]
29+
if risk < min_risk:
30+
min_risk = risk
31+
min_coords = (queue[index][0], queue[index][1])
32+
min_index = index
33+
del queue[min_index]
34+
u = min_coords
35+
36+
ns = [
37+
[u[0] + 1, u[1]],
38+
[u[0] - 1, u[1]],
39+
[u[0], u[1] + 1],
40+
[u[0], u[1] - 1]
41+
]
42+
43+
neighbours = []
44+
for n in ns:
45+
if n[0] >= 0 and \
46+
n[0] < self.size and \
47+
n[1] >= 0 and \
48+
n[1] < self.size and \
49+
(n[0], n[1]) in queue:
50+
neighbours.append((n[0], n[1]))
51+
for v in neighbours:
52+
alt = self.risk[u[0], u[1]] + self.map[v[0], v[1]]
53+
if alt < self.risk[v[0], v[1]]:
54+
self.risk[v[0], v[1]] = alt
55+
56+
return self.risk[self.size - 1, self.size - 1]
57+
58+
def __str__(self):
59+
return f"<{self.__class__.__name__}:\Size: {self.size}\n{self.map}\n>"
60+
61+
62+
lines = [list(line.strip()) for line in open('15.input').readlines()]
63+
64+
map = Map(lines)
65+
66+
print(map.find_risk())

15-2.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#!/usr/bin/env python
2+
3+
import heapq
4+
import numpy
5+
6+
class Map:
7+
def __init__(self, input):
8+
tile_size = len(input)
9+
self.size = tile_size * 5
10+
self.map = numpy.zeros((self.size, self.size), dtype=numpy.uint)
11+
self.risk = numpy.empty((self.size, self.size), dtype=numpy.uint)
12+
self.risk.fill(pow(2, 32) - 1)
13+
14+
for row in range(len(input)):
15+
for col in range(len(input)):
16+
for x in range(5):
17+
for y in range(5):
18+
r = int(input[row][col]) + x + y
19+
if r > 9:
20+
r -= 9
21+
self.map[row + tile_size * x, col + tile_size * y] = r
22+
23+
def find_risk(self):
24+
self.risk[0, 0] = 0
25+
26+
queue = []
27+
heapq.heappush(queue, (0, (0, 0)))
28+
29+
while len(queue) > 0:
30+
risk, coords = heapq.heappop(queue)
31+
x, y = coords
32+
if risk > self.risk[x, y]:
33+
continue
34+
35+
ns = [
36+
[x + 1, y],
37+
[x - 1, y],
38+
[x, y + 1],
39+
[x, y - 1]
40+
]
41+
42+
neighbours = []
43+
for n in ns:
44+
if n[0] >= 0 and \
45+
n[0] < self.size and \
46+
n[1] >= 0 and \
47+
n[1] < self.size:
48+
neighbours.append((n[0], n[1]))
49+
for v in neighbours:
50+
alt = risk + self.map[v[0], v[1]]
51+
if alt < self.risk[v[0], v[1]]:
52+
self.risk[v[0], v[1]] = alt
53+
heapq.heappush(queue, (self.risk[v[0], v[1]], (v[0], v[1])))
54+
55+
return self.risk[self.size - 1, self.size - 1]
56+
57+
def __str__(self):
58+
return f"<{self.__class__.__name__}:\Size: {self.size}\n{self.map}\n>"
59+
60+
61+
lines = [list(line.strip()) for line in open('15.input').readlines()]
62+
63+
map = Map(lines)
64+
65+
print(map.find_risk())

0 commit comments

Comments
 (0)