Advertisement
Guest User

Untitled

a guest
Dec 16th, 2023
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.93 KB | Source Code | 0 0
  1. path = "day_16.txt"
  2. # path = "test.txt"
  3.  
  4. with open(path, 'r') as file:
  5.     grid = [[c for c in line.strip()] for line in file]
  6.  
  7. directions = {
  8.     'U': (-1, 0),
  9.     'D': (1, 0),
  10.     'R': (0, 1),
  11.     'L': (0, -1)
  12. }
  13. reflections = {
  14.     'R': {'/': 'U', '\\': 'D'},
  15.     'L': {'/': 'D', '\\': 'U'},
  16.     'U': {'/': 'R', '\\': 'L'},
  17.     'D': {'/': 'L', '\\': 'R'},
  18. }
  19.  
  20.  
  21. def beam_deflect(beam, char):
  22.     if char == '-':
  23.         return beam[2] if beam[2] in 'RL' else 'RL'
  24.  
  25.     if char == '|':
  26.         return beam[2] if beam[2] in 'UD' else 'UD'
  27.  
  28.     return reflections[beam[2]][char]
  29.  
  30. def propagate_beam(initial, grid):
  31.     beams = [initial]
  32.     R = len(grid)
  33.     C = len(grid)
  34.  
  35.     energized = set()
  36.     seen = set()
  37.     while len(beams) > 0:
  38.         beam = beams.pop()
  39.         i, j = (beam[0] + directions[beam[2]][0], beam[1] + directions[beam[2]][1])
  40.  
  41.         # Beam got to the end of the grid or is a beam we already saw before
  42.         if i >= R or j >= C or i < 0 or j < 0 or beam in seen:
  43.            
  44.             continue
  45.  
  46.         seen.add(beam)
  47.         energized.add((i,j))
  48.         if grid[i][j] == '.':
  49.             beam = (i,j,beam[2])
  50.             beams.append(beam)
  51.             continue
  52.  
  53.         # If we got here, the beam will be deflected, so we can delete it
  54.  
  55.         for d in beam_deflect(beam, grid[i][j]):
  56.             beam = (i,j,d)
  57.             beams.append(beam)
  58.  
  59.     return len(energized)
  60.  
  61. answer = 0
  62. # from above or below
  63. for j in range(len(grid[0])):
  64.     # From up going down
  65.     answer = max(propagate_beam((-1, j, 'D'), grid), answer)
  66.     # From below going up
  67.     answer = max(propagate_beam((len(grid), j, 'U'), grid), answer)
  68.  
  69. # from left or right
  70. for i in range(len(grid)):
  71.     # From left going right
  72.     answer = max(propagate_beam((i, -1, 'R'), grid), answer)
  73.     # From right going left
  74.     answer = max(propagate_beam((i, len(grid[0]), 'L'), grid), answer)
  75.  
  76. print(answer)
  77.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement