Guest User

Untitled

a guest
Dec 24th, 2022
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.14 KB | Source Code | 0 0
  1. puzzle_input = """#.####################################################################################################
  2. #>.^>^v<^v>>>v<.>v><vv<<<.^^>>^v.^^v^vv<<><>v><v>v^>^<<>vvv<<>v>>.^>>^.^>..<<v<v<^.>.>^^<><><><^^.^<>#
  3. #>vv<<v<<<<v>v<v^.<.v<<><v<<.<>>^^.>.^v>^^.^^.><v>><<^^^^<^>>.v.><v.v.<<<<<v>v<^>v^<>^v<^.<^^>^>vv>^>#
  4. #>^.^>^^^v<>v><>v^vv>v>>v<v<<..><><<>v<>v>v^v>vv<v.<.v^vv<v>.>v<^>v>>v..v<>^v.>v.><^><<v<vvv<^>v>.^<>#
  5. #<.v.v^<>^v<<^>v^>v^<.<>>^<><>v.<v>^^><><v>^^>^>.^.v>.<vv>^.>.vv^v^^<^>^.<>.^>^>^><.>>>>^<<v>^^><^v<>#
  6. #<<v<^^v^><.v<v.^>^^<..^^.>v^<^^^^.<><v<^^><^>><^>^v^>.vvvvv^<^>^v<^>^<^>><<>^v<>^^^v<<^>vvv>v^^^<.<<#
  7. #<v^v><<>^^.<v^.v><<>>v^vv<^<^^.v<.v><>><<<.v<.<<<<v>.<><^<v^<>vv^>v<v>^^><^^^v>.^^^<><>>v>v<>^v>>v^<#
  8. #<..^vv>^vv^>v<^<>..^<^v<^><<<>>.vvv^v^>>v>^^>.<<vvv<v.>^>><vv<^^.v^v.v>>><^<<<>^v.>><v>^^>^v<v>^vv>>#
  9. #<^^>v^v^v^>.>v<<>>>^^>vvvvv<>^.v>><>^<>>v^^^^^v<>>>^^>>>^.>><.>v>v^><.^vv^<<<<^v<><^^>vv..^^v^<<^<v>#
  10. #>.v<v^.<v.^vvv^>>^<v^^<<^><><v>>^^>.^v<vv<>><^<.v.v<.<.^vvv^.^v^v><v<<.<>^<v>>v<^^>^vv<.vvv<<^<vv<v<#
  11. #<<v<>>v<<^>v><v.><<.<>^^vvvv^<>.v>v^v.^^>.^^^>^>^>^^><v>.v^>v^vv><<>><^<<vvvv^v<>v^<<.^^v>.>>>><^>^<#
  12. #<>>>>vv>^^<^<^^^^^><v^^<>vvv<><<>v^.vvv^>^v^>v<^<^v>>vvvv^vv<<>.vv<.<vv^^>>>v>>^>v><<v<><v.><v^vvv<>#
  13. #><vv^v<vv<<v^>^.^^>>v>v.^<^v<^v>.vv.^>><><>^<^v>>v<.^.<^.>.^v<.<.>^>^.^>>>>v<^>v>^..^.v<^.><.<<.<^>>#
  14. #<>>^<^v<.<v^v>^^>^>.v^<v>v<^<>^>>.^v><^>vv<<>v>>v>.v<>>^^v>>v<<^^v^v...^.^><^^^.^vvv>vv><<>^<<><<.^>#
  15. #>v^<^^^v^>><.>.v<v>^.v^^.<^^v^.<v<<.>v<.^v>^^...^^^<^>^^vv>v>v>v^v<>vv>>vv^>>>><>^vv^v^<<vv^.><^v<^<#
  16. #<><><><v><><<^^v.^v<>v^<v>>v^v<<^^.^>.<<<>.><^^vv>v<<<<>>v^^^>^<<^^<^.<>>><^^v.<>v>.<.<>>v>>v>>>>v^.#
  17. #>^v>>>>.^<^.v>>><^<<v.<<^vv.^<.>><>v.><>vv>v<.^v.<<^<v<^.v<<^^<<^^<^<v.v>vv^v<vv.^v.<^^>^>^..vv^^>>>#
  18. #..<.><.v<>^>>v<>.>^v.>^vv>>...<.>><<v^v<<>>vv>>v^><<^^>^^.>v.>>>v^^^<.<<v>>^<v<^^<v<v<>>^.<^v>.^^<<<#
  19. #<.<v.><vv<v<^<v<.vv^.v>v^v<.<>v^>>^<^vv>.<^<>.^><<>>.<.<<<><<<^v<^^<><>^^<v.<v>>>>vv.>v^><>v.><^<v.>#
  20. #>^>^>^<<<^v^<<^v>^<.^vvv<>>^>>v>>>^><v<>..>v>>>^^vvv><v^^>^v^.^<v><v.>.<<^vv>^^.<^^v>^><^<^^v<>>>.<>#
  21. #<v^<v><.>v>vv.^>v^^.vv^><^>^^^v^<v^^vvv>><.<..v^v^>^<<^>>^>^>^.>>vv.^>>.v>>><<<>>^<<.>v.v>.<><v<>v>>#
  22. #>^.<<>>vv^<v^v<<>>>>^><vv<^v>>>^v><>v<><v>.>v>^v>><vv><.><<<^^v<>.^<v><><v^>>><<vv.v>^vv>v<<>^<^v^v<#
  23. #<<.vv.<v^vv><>^<^^v^<<<<^>>^><^vv>^^<^.v^>^.v<^^<v<<.<v<^^.<^v^.<^.v>v<v><.>^vv.vv^vv^<<<>.>v^v.v.><#
  24. #<>>>>>v>v.v^>><>v^<^<<<^<vv>>v<<<><v<>.^^<^vvv^.>>><v<<.^v<v<v.^v.v<>v<v<v>v^>>>v>^v<<>>.<>vvv^>>>v<#
  25. #<^.<<^<v>v<^^v<^<<>v.<<^^<.<>><<><>v<><.<<<^>v.^>v<<>.^><vv^>>>vvvv^<^v^>v<^v<>.<vv>^v><v<v^>.v<<v>>#
  26. #<.<v><>^>>.>v^vv>^^<^><.>>^v^<><>v^^v<>>.v.>v>.^^vvvv<><>v^>v>v<<.^v^^<v^^v>v^^v>v><>v>vvv<^>^>^<v<>#
  27. #<v<.<>^^^<vv.^^>v>^.>>>.<<><vvv^>vvv.<v<.v>v<.<<v<^<^^><^^^.>^<.v>><<^^.^.<^v^.<>v.v^><<<^.<.^^vvv^>#
  28. #<v.v><.>>><.><<>>.^>.<<v>>^>.>^>v>v>>..v^^><v.><<^vv>^v^>.>>><>^.vvv^.<<>vv>><<>>vv>v<<<^<>v>><>vv<<#
  29. #>v^^v<><>^^>v^><^^<>.^vv>vv^^^<<.^^vv^<^^^v>.v^^<^><^<<v>>^..^<<<<^vv>><v<^<>^>v>^>.>.<<<>.^^>vv^^>>#
  30. #>.>^<^>.v^>>>vv<>>^>><<>v^.^>.>>><^^^<><>^v>^vv><vv>.>v^<^^v>vv^vv<v.<>vv.>.<^^<><v>v>^^<.<vv<<^vv^>#
  31. #>.>>^<^.^><<v.^<^^v<^^<v<<><v^><^.>^><>v>>>^.^^>>><><^>>>><>^^.v^>><.>.^>.<^.v^<<<>>>>><.^vv<>>vv<^>#
  32. #>v>^^<v.<>^v.<v>v^v>^^.>>>.>.<<^<<>^v>><.v>v^<>>vv^>v<.<^^v<>vv^^<v>>v>^v>^<^v<>^v^<.^>^.<>>><.^v>..#
  33. #>.^^.<>.>v^^>>^>^^<.<<>..>>^><><<v<^><<^v^<>v><v>^>><><<v^<^<v<v.v<.>.>>>>^^^v<.v><><><v<^<vv.>>><.>#
  34. #<>^>.v>v>v<v<v>v.>^<v^vv<vvv>^v<^>^v><>.<><vv>v<<.<v>>^^v>^<vv.><>v.^^.>.^<^v<.><^^>><<>.^^v.>v><<.<#
  35. #>>v.v>^^.>>>.<>>^v<^>.<>^^<<><.v><v.>>>^^<>>>^>v>>^>^v>><><^.^^><^^^><v^><v><v^>^.>v>>>v<><vv<v^.>.>#
  36. #>>>>>^<<^v^v<<^>.vv.vv^^v^<vv.>>>v^.<..^v^^v<><v>^<<^.^.v<^.<<<>vv>..^v>>><>^<v<>><^^.^^>^.^^>v>><v>#
  37. ####################################################################################################.#"""
  38.  
  39. puzzle_input_example = """#.######
  40. #>>.<^<#
  41. #.<..<<#
  42. #>v.><>#
  43. #<^v^^>#
  44. ######.#"""
  45.  
  46. import numpy as np
  47.  
  48. DIRECTION_CODE = {">" : (1,0), "<" : (-1,0), "v" : (0,1), "^" : (0,-1)}
  49. MOVES = [(0,1),(1,0),(0,0),(-1,0),(0,-1),]
  50.  
  51. class Blizzard():
  52.     def __init__(self,offset,direction):
  53.         self.offset = offset
  54.         self.direction = direction
  55.  
  56. # Read map
  57.  
  58. lines = puzzle_input.split("\n")
  59.  
  60. blizzards = []
  61. entrance_x = lines[0].index(".")
  62. exit_x = lines[-1].index(".")
  63.  
  64. field_width = len(lines[0])
  65. field_height = len(lines)
  66.  
  67. for y, line in enumerate(lines):
  68.     for x in range(len(line)):
  69.         if (line[x] != "#") and (line[x] != "."):
  70.             blizzards.append(Blizzard((x-1,y-1),DIRECTION_CODE[line[x]]))
  71.  
  72. def state_at_timepoint(time_point):
  73.     global field_width
  74.     global field_height
  75.     global entrance_x
  76.     global exit_x
  77.     global blizzard
  78.     result = np.zeros((field_width,field_height))
  79.     result[0,:] = 1 # Wall on top
  80.     result[-1,:] = 1 # Wall on bottom
  81.     result[:,0] = 1 # Wall on left
  82.     result[:,-1] = 1 # Wall on right
  83.     result[entrance_x,0] = 0
  84.     result[exit_x,-1] = 0
  85.     for blizzard in blizzards:
  86.         blizzard_x = 1 + (blizzard.offset[0] + blizzard.direction[0] * time_point) % (field_width - 2)
  87.         blizzard_y = 1 + (blizzard.offset[1] + blizzard.direction[1] * time_point) % (field_height - 2)
  88.         result[blizzard_x,blizzard_y] = 2
  89.     return result
  90.  
  91.  
  92. def display_state(state):
  93.     for y in range(state.shape[1]):
  94.         line = ""
  95.         for x in range(state.shape[0]):
  96.             line += str(int(state[x,y]))
  97.         print(line)
  98.        
  99.  
  100. timepoint = 0
  101.  
  102. # First pass forward
  103.  
  104. reachable = np.zeros((field_width,field_height))
  105. reachable[entrance_x,0] = 1
  106.  
  107. while not reachable[exit_x,field_height-1] == 1:
  108.     timepoint += 1
  109.     next_state = state_at_timepoint(timepoint)
  110.     reachable_next_state = np.zeros((field_width,field_height))
  111.     for y in range(field_height):
  112.         for x in range(field_width):
  113.             for move in MOVES:
  114.                 if reachable[x,y] == 1:
  115.                     if (y+move[1] >= 0 and y+move[1] < field_height):
  116.                         if next_state[x+move[0],y+move[1]] == 0:
  117.                             reachable_next_state[x+move[0],y+move[1]] = 1
  118.     reachable = reachable_next_state
  119.  
  120. print("Made it to the exit in",timepoint,"steps")
  121.  
  122.  
Advertisement
Add Comment
Please, Sign In to add comment