16_beam.py 1.1 KB

123456789101112131415161718192021222324252627282930313233343536
  1. #!/usr/bin/env python3
  2. import sys
  3. def energize(grid, x, y, dx, dy, visited=None):
  4. visited = {} if visited is None else visited
  5. while 0 <= x < len(grid[0]) and 0 <= y < len(grid):
  6. directions = visited.setdefault((x, y), [])
  7. if (dx, dy) in directions:
  8. break
  9. directions.append((dx, dy))
  10. cell = grid[y][x]
  11. if cell in '/\\':
  12. dx, dy = (dy, -dx) if (dx if cell == '/' else dy) else (-dy, dx)
  13. elif cell == '-' and dy:
  14. energize(grid, x + 1, y, 1, 0, visited)
  15. dx, dy = -1, 0
  16. elif cell == '|' and dx:
  17. energize(grid, x, y + 1, 0, 1, visited)
  18. dx, dy = 0, -1
  19. x += dx
  20. y += dy
  21. return len(visited)
  22. def energies(grid):
  23. w = len(grid[0])
  24. h = len(grid)
  25. for x in range(w):
  26. yield energize(grid, x, 0, 0, 1)
  27. yield energize(grid, x, h - 1, 0, -1)
  28. for y in range(h):
  29. yield energize(grid, 0, y, 1, 0)
  30. yield energize(grid, w - 1, y, -1, 0)
  31. grid = [line.rstrip() for line in sys.stdin]
  32. print(energize(grid, 0, 0, 1, 0))
  33. print(max(energies(grid)))