Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import heapq
- moves = {
- "<" : (0, -1),
- ">" : (0, 1),
- "v" : (1, 0),
- "^" : (-1, 0),
- }
- left_turn = {
- "<" : "v",
- ">" : "^",
- "v" : ">",
- "^" : "<",
- }
- right_turn = {
- "<" : "^",
- ">" : "v",
- "v" : "<",
- "^" : ">",
- }
- virages = {
- ("<","/") : "v",
- (">","/") : "^",
- ("^","/") : ">",
- ("v","/") : "<",
- (">","\\") : "v",
- ("<","\\") : "^",
- ("v","\\") : ">",
- ("^","\\") : "<",
- }
- def init():
- m = []
- carts = {}
- pos_carts = []
- with open('13', "r") as file:
- for i, line in enumerate(file.readlines()):
- m.append([])
- for j,c in enumerate(line):
- if c in ["<",">","v", "^"]:
- m[-1].append("-")
- carts[(i,j)] = (c,0)
- pos_carts.append((i,j))
- else:
- m[-1].append(c)
- heapq.heapify(pos_carts)
- return (pos_carts, carts, m)
- def view(m):
- for l in m:
- for c in l:
- print(c, end='')
- print("")
- def turn_intersection(cart):
- global left_turn, right_turn
- new_direction = cart[0]
- if cart[1] == 0:
- new_direction = left_turn[cart[0]]
- if cart[1] == 2:
- new_direction = right_turn[cart[0]]
- new_number = (cart[1]+1) % 3
- return (new_direction, new_number)
- def turn_junction(cart, junction):
- global virages
- new_direction = virages[(cart[0],junction)]
- return (new_direction, cart[1])
- def step(pos, m, carts, moves):
- new_pos = []
- removed = set()
- while len(pos)>0:
- p = heapq.heappop(pos)
- if(p in removed):
- continue
- cart = carts[p]
- move = moves[cart[0]]
- new_p = (p[0]+move[0], p[1]+move[1])
- try:
- assert(new_p[0]>=0)
- assert(new_p[1]>=0)
- except AssertionError:
- print("SHIT", p, new_p, move)
- return ([], [])
- new_cart = cart
- if m[new_p[0]][new_p[1]] == "+":
- new_cart = turn_intersection(cart)
- if m[new_p[0]][new_p[1]] in ["/","\\"]:
- new_cart = turn_junction(cart, m[new_p[0]][new_p[1]])
- del carts[p]
- if new_p in carts.keys():
- print("Crash at {}, {}".format(new_p[1], new_p[0]))
- del carts[new_p]
- if new_p in new_pos:
- new_pos.remove(new_p)
- removed.add(new_p)
- removed.add(p)
- else:
- new_pos.append(new_p)
- carts[new_p] = new_cart
- return (new_pos, carts)
- (pos_carts, carts, m) = init()
- while len(pos_carts)>1:
- pos_carts, carts = step(pos_carts, m, carts, moves)
- print(pos_carts)
Add Comment
Please, Sign In to add comment