Advertisement
Guest User

Untitled

a guest
Dec 18th, 2024
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.44 KB | Software | 0 0
  1. import os
  2. import time
  3.  
  4.  
  5. class Grid:
  6.     def __init__(self, byte_list, w, h):
  7.         self._byte_list = byte_list
  8.         self._w = w
  9.         self._h = h
  10.         self._last_byte = None
  11.         self._path = None
  12.  
  13.         self._grid = [[0 for _ in range(self._h)] for _ in range(self._w)]
  14.  
  15.     def __repr__(self):
  16.         output = ""
  17.         for j in range(self._h):
  18.             for i in range(self._w):
  19.                 output += "." if self._grid[i][j] == 0 else "#"
  20.  
  21.             output += "\n"
  22.         return output
  23.  
  24.     def fall_bytes(self, num_bytes=-1):
  25.  
  26.         if num_bytes < 0:
  27.             num_bytes = len(self._byte_list)
  28.  
  29.         while num_bytes > 0 and len(self._byte_list) > 0:
  30.             i, j = self._byte_list.pop(0)
  31.             self._last_byte = (i, j)
  32.             self._grid[i][j] += 1
  33.             num_bytes -= 1
  34.  
  35.     def get_neighbours(self, i, j):
  36.  
  37.         dirs = [(-1, 0), (1, 0), (0, -1), (0, 1)]
  38.         neighbours = []
  39.         for di, dj in dirs:
  40.             i2 = i + di
  41.             j2 = j + dj
  42.             if i2 >= 0 and j2 >= 0 and i2 < self._w and j2 < self._h and self._grid[i2][j2] == 0:
  43.                 neighbours.append((i2, j2))
  44.         return neighbours
  45.  
  46.     def shortest_path(self):
  47.  
  48.         start_node = (0, 0)
  49.         end_node = (self._w - 1, self._h - 1)
  50.  
  51.         visited = set()
  52.         lengths = {start_node: 0}
  53.         todo = [start_node]
  54.         parents = {start_node: None}
  55.  
  56.         while len(todo) > 0:
  57.             coords = todo.pop(0)
  58.             visited.add(coords)
  59.             for nei in self.get_neighbours(*coords):
  60.                 length = lengths[coords] + 1
  61.                 if nei not in visited or length < lengths[nei]:
  62.                     lengths[nei] = length
  63.                     parents[nei] = coords
  64.                     if nei not in todo:
  65.                         todo.append(nei)
  66.  
  67.                 if nei == end_node:
  68.                     n = nei
  69.                     self._path = [n]
  70.                     while parents[n] is not None:
  71.                         n = parents[n]
  72.                         self._path.append(n)
  73.                     return lengths[nei]
  74.  
  75.         return -1
  76.  
  77.     def get_last_byte(self):
  78.         return self._last_byte
  79.  
  80.     def get_path(self):
  81.         return self._path
  82.  
  83.  
  84. def parse_input():
  85.  
  86.     with open(os.path.join(os.path.dirname(__file__), "input.txt"), "r") as file:
  87.         txt = file.read().strip()
  88.  
  89.     byte_list = [list(map(int, line.split(","))) for line in txt.split("\n")]
  90.  
  91.     return byte_list
  92.  
  93.  
  94. def solve_level_1():
  95.     """
  96.    Solve level 1
  97.    """
  98.  
  99.     # Read input file
  100.     byte_list = parse_input()
  101.  
  102.     size = 71
  103.     n_fall = 1024
  104.     grid = Grid(byte_list, size, size)
  105.  
  106.     grid.fall_bytes(n_fall)
  107.  
  108.     return grid.shortest_path()
  109.  
  110.  
  111. def solve_level_2():
  112.     """
  113.    Solve level 2
  114.    """
  115.  
  116.     # Read input file
  117.     byte_list = parse_input()
  118.  
  119.     size = 71
  120.     n_fall = 1024
  121.     grid = Grid(byte_list, size, size)
  122.  
  123.     grid.fall_bytes(n_fall)
  124.  
  125.     while grid.shortest_path() >= 0:
  126.  
  127.         while grid.get_last_byte() not in grid.get_path():
  128.             grid.fall_bytes(1)
  129.  
  130.     return grid.get_last_byte()
  131.  
  132.  
  133. if __name__ == "__main__":
  134.  
  135.     start = time.time()
  136.     print(solve_level_1())
  137.     stop = time.time()
  138.  
  139.     print(f"Level 1 run in {stop - start:.4e} s")
  140.  
  141.     start = time.time()
  142.     print(solve_level_2())
  143.     stop = time.time()
  144.  
  145.     print(f"Level 2 run in {stop - start:.4e} s")
  146.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement