Advertisement
Guest User

AdventOfCode2018, day 23

a guest
Dec 13th, 2018
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.00 KB | None | 0 0
  1.  
  2. class Cart:
  3.     STATES = [-1, 0, 1]
  4.  
  5.     MOVEMENT_INSTRUCTIONS = {'^': 3, 'v': 1, '<': 2,
  6.                              '>': 0}
  7.  
  8.     def __init__(self, pos, sign, raw_map):
  9.         self.raw_map = raw_map
  10.         map_width = len(raw_map.split('\n')[0]) + 1
  11.  
  12.         self.directions = [1, map_width, -1, -map_width]
  13.         self.pos = pos
  14.         self.state = 0
  15.         self.direction = self.MOVEMENT_INSTRUCTIONS[sign]
  16.  
  17.     def intersect(self):
  18.         state = self.state % 3
  19.         self.direction = (self.direction + self.STATES[state] + 4) % 4
  20.         self.state = (state + 1) % 3
  21.  
  22.     def move(self):
  23.         self.pos += self.directions[self.direction]
  24.         track = self.raw_map[self.pos]
  25.         if track in ['\\', '/']:
  26.             self.corner(track)
  27.         elif track == '+':
  28.             self.intersect()
  29.  
  30.     def corner(self, track):
  31.         if track == '/':
  32.             if self.direction == 0:
  33.                 self.direction = 3
  34.             elif self.direction == 1:
  35.                 self.direction = 2
  36.             elif self.direction == 2:
  37.                 self.direction = 1
  38.             elif self.direction == 3:
  39.                 self.direction = 0
  40.             else:
  41.                 print(self.direction)
  42.                 raise ValueError
  43.         else:
  44.             if self.direction == 2:
  45.                 self.direction = 3
  46.             elif self.direction == 3:
  47.                 self.direction = 2
  48.             elif self.direction == 1:
  49.                 self.direction = 0
  50.             elif self.direction == 0:
  51.                 self.direction = 1
  52.             else:
  53.                 print(self.direction)
  54.                 print(track)
  55.                 raise ValueError
  56.  
  57.  
  58. def find_solutions(raw_map, return_on_first_collision=False):
  59.     carts = {}
  60.     map_width = len(raw_map.split('\n')[0]) + 1
  61.     for pos, c in enumerate(raw_map):
  62.         if c in '<>^v':
  63.             carts[pos] = Cart(pos, c, raw_map)
  64.     # MAP_RAW = [c for c in MAP_RAW if c != '\n']
  65.     round_counter = 0
  66.     collision = 0
  67.     while len(carts) > 1:
  68.         current_carts = sorted(carts.keys())
  69.         for cart_pos in current_carts:
  70.             try:
  71.                 cart = carts[cart_pos]
  72.             except KeyError:
  73.                 continue
  74.             cart.move()
  75.             del carts[cart_pos]
  76.             new_pos = cart.pos
  77.             if new_pos in carts:
  78.                 collision += 1
  79.                 if collision == 1:
  80.                     first_collision_coordinates = (
  81.                         new_pos % map_width, new_pos // map_width)
  82.                     print('First collision : {},{}'.format(
  83.                         *first_collision_coordinates
  84.                         )
  85.                           )
  86.                     if return_on_first_collision:
  87.                         return first_collision_coordinates
  88.                 del carts[new_pos]
  89.             else:
  90.                 carts[new_pos] = cart
  91.         round_counter += 1
  92.     try:
  93.         try:
  94.             remaining_cart = carts.keys()[0]
  95.         except TypeError:  # Python3 .keys() is not a list
  96.             remaining_cart = list(carts.keys())[0]
  97.         remaining_cart_coordinates = (remaining_cart % map_width,
  98.                                       remaining_cart // map_width)
  99.         print('Last remaining cart: {},{}'.format(*remaining_cart_coordinates))
  100.         return remaining_cart_coordinates
  101.     except IndexError:
  102.         print('No carts left after the last collision!')
  103.         return None
  104.  
  105.  
  106. if __name__ == '__main__':
  107.     from input_day13 import raw
  108.  
  109.     #
  110.     MAP_RAW = raw
  111.     map = [[c for c in line] for line in MAP_RAW.split('\n') if line]
  112.  
  113.     test_map_part1 = r"""/->-\      
  114. |   |  /----\
  115. | /-+--+-\ |
  116. | | |  | v  |
  117. \-+-/  \-+--/
  118.  \------/   """
  119.  
  120.     test_map_part2 = r"""/>-<\
  121. |   |  
  122. | /<+-\
  123. | | | v
  124. \>+</ |
  125.  |   ^
  126.  \<->/"""
  127.     assert find_solutions(test_map_part1, return_on_first_collision=True) == (7, 3)
  128.     assert find_solutions(test_map_part2) == (6, 4)
  129.     find_solutions(MAP_RAW)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement