Guest User

Untitled

a guest
Dec 13th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.63 KB | None | 0 0
  1. import heapq
  2.  
  3. moves = {
  4. "<" : (0, -1),
  5. ">" : (0, 1),
  6. "v" : (1, 0),
  7. "^" : (-1, 0),
  8. }
  9.  
  10. left_turn = {
  11. "<" : "v",
  12. ">" : "^",
  13. "v" : ">",
  14. "^" : "<",
  15. }
  16.  
  17. right_turn = {
  18. "<" : "^",
  19. ">" : "v",
  20. "v" : "<",
  21. "^" : ">",
  22. }
  23.  
  24. virages = {
  25. ("<","/") : "v",
  26. (">","/") : "^",
  27. ("^","/") : ">",
  28. ("v","/") : "<",
  29. (">","\\") : "v",
  30. ("<","\\") : "^",
  31. ("v","\\") : ">",
  32. ("^","\\") : "<",
  33. }
  34.  
  35. def init():
  36. m = []
  37. carts = {}
  38. pos_carts = []
  39. with open('13', "r") as file:
  40. for i, line in enumerate(file.readlines()):
  41. m.append([])
  42. for j,c in enumerate(line):
  43. if c in ["<",">","v", "^"]:
  44. m[-1].append("-")
  45. carts[(i,j)] = (c,0)
  46. pos_carts.append((i,j))
  47. else:
  48. m[-1].append(c)
  49.  
  50. heapq.heapify(pos_carts)
  51. return (pos_carts, carts, m)
  52.  
  53. def view(m):
  54. for l in m:
  55. for c in l:
  56. print(c, end='')
  57. print("")
  58.  
  59. def turn_intersection(cart):
  60. global left_turn, right_turn
  61. new_direction = cart[0]
  62. if cart[1] == 0:
  63. new_direction = left_turn[cart[0]]
  64. if cart[1] == 2:
  65. new_direction = right_turn[cart[0]]
  66. new_number = (cart[1]+1) % 3
  67. return (new_direction, new_number)
  68.  
  69. def turn_junction(cart, junction):
  70. global virages
  71. new_direction = virages[(cart[0],junction)]
  72. return (new_direction, cart[1])
  73.  
  74. def step(pos, m, carts, moves):
  75. new_pos = []
  76. removed = set()
  77. while len(pos)>0:
  78. p = heapq.heappop(pos)
  79. if(p in removed):
  80. continue
  81. cart = carts[p]
  82. move = moves[cart[0]]
  83. new_p = (p[0]+move[0], p[1]+move[1])
  84. try:
  85. assert(new_p[0]>=0)
  86. assert(new_p[1]>=0)
  87. except AssertionError:
  88. print("SHIT", p, new_p, move)
  89. return ([], [])
  90. new_cart = cart
  91. if m[new_p[0]][new_p[1]] == "+":
  92. new_cart = turn_intersection(cart)
  93. if m[new_p[0]][new_p[1]] in ["/","\\"]:
  94. new_cart = turn_junction(cart, m[new_p[0]][new_p[1]])
  95.  
  96. del carts[p]
  97. if new_p in carts.keys():
  98. print("Crash at {}, {}".format(new_p[1], new_p[0]))
  99. del carts[new_p]
  100. if new_p in new_pos:
  101. new_pos.remove(new_p)
  102. removed.add(new_p)
  103. removed.add(p)
  104. else:
  105. new_pos.append(new_p)
  106. carts[new_p] = new_cart
  107. return (new_pos, carts)
  108.  
  109. (pos_carts, carts, m) = init()
  110.  
  111. while len(pos_carts)>1:
  112. pos_carts, carts = step(pos_carts, m, carts, moves)
  113. print(pos_carts)
Add Comment
Please, Sign In to add comment