Advertisement
HexTree

Advent of Code 2022 Day 24

Dec 24th, 2022
1,462
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.97 KB | Source Code | 0 0
  1. from math import gcd
  2. from queue import Queue
  3.  
  4. grid = []
  5. with open('input', 'r') as f:
  6.     for line in f.readlines():
  7.         grid.append([char for char in line.strip()[1:-1]])
  8. del grid[0]
  9. del grid[-1]
  10.  
  11. height = len(grid)
  12. width = len(grid[0])
  13.  
  14. lcm = (height * width) // gcd(height, width)
  15. print(height, width, lcm)
  16.  
  17. clear_weather_map = {}
  18. for i in range(height):
  19.     for j in range(width):
  20.         cell = (i, j)
  21.         bliz_times = set()
  22.         for jt in range(width):
  23.             bliz = grid[i][jt]
  24.             if bliz == '>':
  25.                 for k in range(lcm//width):
  26.                     bliz_times.add(k * width + (j - jt) % width)
  27.             elif bliz == '<':
  28.                 for k in range(lcm//width):
  29.                     bliz_times.add(k * width + (jt - j) % width)
  30.         for it in range(height):
  31.             bliz = grid[it][j]
  32.             if bliz == 'v':
  33.                 for k in range(lcm//height):
  34.                     bliz_times.add(k * height + (i - it) % height)
  35.             elif bliz == '^':
  36.                 for k in range(lcm//height):
  37.                     bliz_times.add(k * height + (it - i) % height)
  38.         clear_weather_map[(i, j)] = set(range(lcm)) - bliz_times
  39.  
  40. # for k, v in clear_weather_map.items():
  41. #     print(k, len(v))
  42.  
  43.  
  44. def get_nbrs(node):
  45.     pos, time = node
  46.     new_time = (time + 1) % lcm
  47.  
  48.     if pos == (-1, 0):
  49.         nbrs = [pos, (0, 0)]
  50.     elif pos == (height, width-1):
  51.         nbrs = [pos, (height-1, width-1)]
  52.     else:
  53.         nbrs = [pos]
  54.         for (dx, dy) in [(0, 1), (1, 0), (0, -1), (-1, 0)]:
  55.             nbr = (pos[0] + dx, pos[1] + dy)
  56.             if 0 <= nbr[0] < height and 0 <= nbr[1] < width:
  57.                 nbrs.append(nbr)
  58.         if pos == (0, 0):
  59.             nbrs.append((-1, 0))
  60.         elif pos == (height-1, width-1):
  61.             nbrs.append((height, width-1))
  62.  
  63.     result = []
  64.     for nbr in nbrs:
  65.         if nbr in [(-1, 0), (height, width-1)]:
  66.             result.append((nbr, new_time))
  67.         elif new_time in clear_weather_map[nbr]:
  68.             result.append((nbr, new_time))
  69.     return result
  70.  
  71.  
  72. # bfs
  73. def bfs(start, goal, time):
  74.     q = Queue()
  75.     starting_node = (start, time)
  76.     q.put(starting_node)
  77.     g_dist = {starting_node: 0}
  78.  
  79.     while q:
  80.         current = q.get()
  81.         # print(current)
  82.         if current[0] == goal:
  83.             return g_dist[current]
  84.  
  85.         for nbr in get_nbrs(current):
  86.             # print("nbr", nbr)
  87.             if nbr in g_dist:
  88.                 continue
  89.             g_dist[nbr] = g_dist[current]+1
  90.             q.put(nbr)
  91.  
  92. time = 0
  93. start = (-1, 0)
  94. end = (height, width-1)
  95.  
  96. print("starting bfs 1st trip")
  97. steps = bfs(start, end, time)
  98. time += steps
  99. print("arrived at end at time:", time)
  100.  
  101. print("starting bfs 2nd trip")
  102. steps = bfs(end, start, time)
  103. time += steps
  104. print("arrived at start at time:", time)
  105.  
  106. print("starting bfs 3rd trip")
  107. steps = bfs(start, end, time)
  108. time += steps
  109. print("arrived at end at time:", time)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement