advent-of-code/2021/python/day15.py

88 lines
2.2 KiB
Python

import matrix
import numpy as np
import shared
from pprint import pprint as pp
from queue import PriorityQueue
X = '.'
class Chiton:
def __init__(self, name):
self.load(name)
self.y = 0
self.x = 0
self.values = []
self.set_goal()
def load(self, name):
self.base = np.array(matrix.load_matrix_file(name))
self.mx = self.base.copy()
def walk(self):
# Dijkstra from RedBlobGames
start = (self.x,self.y)
frontier = PriorityQueue()
frontier.put(start, 0)
came_from = dict()
cost_so_far = dict()
came_from[start] = None
cost_so_far[start] = 0
while not frontier.empty():
current = frontier.get()
if current == self.goal:
break
for _nxt in self.neighbors(current):
nxt = (_nxt['x'],_nxt['y'])
new_cost = cost_so_far[current] + _nxt['value']
if nxt not in cost_so_far or new_cost < cost_so_far[nxt]:
cost_so_far[nxt] = new_cost
priority = new_cost
frontier.put(nxt, priority)
came_from[nxt] = current
print(cost_so_far[self.goal])
def neighbors(self, pos):
return matrix.get_neighbors(self.mx, x=pos[0], y=pos[1], _dict=True)
def pp(self):
matrix.ppmx(self.mx,pad=False,space=False)
print(self.x,self.y)
def grow(self, size):
ALL = [self.base.copy()]
for x in range(25):
n = ALL[-1].copy()
n = self.increment(n)
ALL.append(n)
rows = []
for x in range(5):
rows.append(np.hstack(ALL[x:x+5]))
grid = np.array(rows.pop(0))
for row in rows:
grid = np.vstack((grid,row))
self.mx = grid
self.set_goal()
def set_goal(self):
h,w = matrix.get_size(self.mx)
self.goal = (h-1,w-1)
def increment(self, row):
row += 1
row = np.where(row > 9, 1, row)
return row
def main():
c = Chiton(shared.get_fname(15))
c.walk()
c.grow(5)
c.walk()
if __name__ == "__main__":
main()