Advertisement
GalinaKG

Advent of code - Day 12 - Second task

Dec 12th, 2022
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.28 KB | None | 0 0
  1. input_file = open('text.txt', 'r').read().strip().split('\n')
  2.  
  3. height_map = []
  4. start_pos = []
  5. end_positions = []
  6. unvisited_nodes = []
  7. visited_nodes = []
  8. travel_dict = dict()
  9.  
  10. width = len(input_file[0])
  11. height = len(input_file)
  12.  
  13. for i in range(height):
  14.     line = input_file[i]
  15.     height_line = []
  16.     for j in range(width):
  17.         char = line[j]
  18.         if char in ['S', 'a']:
  19.             char = 'a'
  20.             end_positions.append((i, j))
  21.         elif char == 'E':
  22.             start_pos = (i, j)
  23.             char = 'z'
  24.  
  25.         height_line.append(ord(char) - ord('a'))
  26.         unvisited_nodes.append((i, j))
  27.     height_map.append(height_line)
  28.  
  29. for i in range(height):
  30.     for j in range(width):
  31.         visitable_nodes = []
  32.         for m in [-1, 0, 1]:
  33.             for n in [-1, 0, 1]:
  34.                 if 0 <= i+m < height and 0 <= j+n < width and abs(n)+abs(m) == 1:
  35.                     if height_map[i+m][j+n] - height_map[i][j] >= -1:
  36.                         visitable_nodes.append((i+m, j+n))
  37.         travel_dict[(i, j)] = visitable_nodes
  38.  
  39.  
  40. class Dijkstra:
  41.     def __init__(self, unvisited, visited, start_node, end_nodes, node_map):
  42.         self.unvisited = unvisited
  43.         self.visited = visited
  44.         self.start_node = start_node
  45.         self.end_nodes = end_nodes
  46.         self.node_map = node_map
  47.         self.node_distance = dict(zip(unvisited_nodes, [999]*(height*width)))
  48.         self.node_distance[start_node] = 0
  49.  
  50.     def visit_node(self, current_node):
  51.         for node in self.node_map[current_node]:
  52.             if node not in self.visited:
  53.                 if self.node_distance[current_node] + 1 < self.node_distance[node]:
  54.                     self.node_distance[node] = self.node_distance[current_node] + 1
  55.         self.unvisited.remove(current_node)
  56.         self.visited.append(current_node)
  57.  
  58.     def run_dijkstras(self):
  59.         while not set(self.end_nodes).issubset(set(self.visited)):
  60.             current_node = min(self.unvisited, key=self.node_distance.get)
  61.             self.visit_node(current_node)
  62.         return self.node_distance
  63.  
  64.  
  65. graph = Dijkstra(unvisited_nodes, visited_nodes, start_pos, end_positions, travel_dict)
  66.  
  67. final_distances = graph.run_dijkstras()
  68. print(final_distances[min(end_positions, key=final_distances.get)])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement