advent-of-code/2022/python/day12.py
2022-12-12 11:44:03 -05:00

60 lines
1.5 KiB
Python

import shared
import matrix
from dijkstar import Graph, find_path, algorithm
criteria = lambda _cur, _neighbor: _neighbor - _cur <= 1
def build_graph(mx):
graph = Graph()
for y, row in enumerate(mx):
for x, _ in enumerate(row):
neighbors = matrix.valid_neighbors(mx, x=x, y=y, criteria=criteria)
for neighbor in neighbors:
graph.add_edge((y, x), (neighbor["y"], neighbor["x"]), 1)
return graph
def part1(mx):
start = matrix.find_in_matrix(mx, "S")
end = matrix.find_in_matrix(mx, "E")
mx[start[0]][start[1]] = "a"
mx[end[0]][end[1]] = "z"
matrix.apply_to_all(mx, lambda x: ord(x) - ord("a"))
graph = build_graph(mx)
path = find_path(graph, start, end)
print(len(path.nodes))
def part2(mx):
end = matrix.find_in_matrix(mx, "E")
s = matrix.find_in_matrix(mx, "S")
mx[s[0]][s[1]] = "a"
mx[end[0]][end[1]] = "z"
starts = matrix.find_in_matrix(mx, "a", one=False)
matrix.apply_to_all(mx, lambda x: ord(x) - ord("a"))
graph = build_graph(mx)
n_counts = []
for start in starts:
try:
path = find_path(graph, start, end)
n_counts.append(len(path.nodes) - 1)
except algorithm.NoPathError:
pass
print(n_counts)
print(min(n_counts))
def main():
mx = matrix.load_matrix_file(shared.get_fname(12), matrix.split_word_to_chr_list)
# part1(mx)
part2(mx)
if __name__ == "__main__":
main()