Advertisement
Guest User

Untitled

a guest
Dec 16th, 2023
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.32 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. beams = [(0, -1, 'R')]
  8. R = len(grid)
  9. C = len(grid)
  10. directions = {
  11.     'U': (-1, 0),
  12.     'D': (1, 0),
  13.     'R': (0, 1),
  14.     'L': (0, -1)
  15. }
  16. reflections = {
  17.     'R': {'/': 'U', '\\': 'D'},
  18.     'L': {'/': 'D', '\\': 'U'},
  19.     'U': {'/': 'R', '\\': 'L'},
  20.     'D': {'/': 'L', '\\': 'R'},
  21. }
  22.  
  23.  
  24. def beam_deflect(beam, i, j, char):
  25.     if char == '-':
  26.         return beam[2] if beam[2] in 'RL' else 'RL'
  27.  
  28.     if char == '|':
  29.         return beam[2] if beam[2] in 'UD' else 'UD'
  30.  
  31.     return reflections[beam[2]][char]
  32.  
  33.  
  34. energized = set()
  35. seen = set()
  36. while len(beams) > 0:
  37.     beam = beams.pop()
  38.     i, j = (beam[0] + directions[beam[2]][0], beam[1] + directions[beam[2]][1])
  39.  
  40.     # Beam got to the end of the grid or is a beam we already saw before
  41.     if i >= R or j >= C or i < 0 or j < 0 or beam in seen:
  42.        
  43.         continue
  44.  
  45.     seen.add(beam)
  46.     energized.add((i,j))
  47.     if grid[i][j] == '.':
  48.         beam = (i,j,beam[2])
  49.         beams.append(beam)
  50.         continue
  51.  
  52.     # If we got here, the beam will be deflected, so we can delete it
  53.  
  54.     for d in beam_deflect(beam, i, j, grid[i][j]):
  55.         beam = (i,j,d)
  56.         beams.append(beam)
  57.  
  58. print(len(energized))
  59.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement