SHARE
TWEET

Untitled

a guest Dec 13th, 2018 70 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. raw = r"""/->-\        
  2. |   |  /----\
  3. | /-+--+-\  |
  4. | | |  | v  |
  5. \-+-/  \-+--/
  6.   \------/  """
  7.  
  8. raw = r"""/>-<\  
  9. |   |  
  10. | /<+-\
  11. | | | v
  12. \>+</ |
  13.   |   ^
  14.   \<->/"""
  15.  
  16. raw = open("input.txt").read()
  17.  
  18.  
  19. DOWN, UP, LEFT, RIGHT = list("v^<>")
  20. G_LEFT, G_STRAIGHT, G_RIGHT = range(3)
  21. DELTA = {DOWN: (0, 1), UP: (0, -1), LEFT: (-1, 0), RIGHT: (1, 0)}
  22.  
  23.  
  24. def read(raw):
  25.     track = []
  26.     cars = {}
  27.     for y, line in enumerate(raw.split("\n")):
  28.         row = list(line)
  29.         for x, direction in enumerate(row):
  30.             if direction in (DOWN, UP, LEFT, RIGHT):
  31.                 cars[len(cars)] = [x, y, direction, G_LEFT]
  32.                 if direction in (LEFT, RIGHT):
  33.                     row[x] = "-"
  34.                 else:
  35.                     row[x] = "|"
  36.         track.append(row)
  37.     return track, cars
  38.  
  39.  
  40. def turn(street, direction, turning):
  41.     if street == "+":
  42.         if turning == G_LEFT:
  43.             if direction == LEFT:
  44.                 direction = DOWN
  45.             elif direction == RIGHT:
  46.                 direction = UP
  47.             elif direction == DOWN:
  48.                 direction = RIGHT
  49.             else:
  50.                 direction = LEFT
  51.         elif turning == G_RIGHT:
  52.             if direction == LEFT:
  53.                 direction = UP
  54.             elif direction == RIGHT:
  55.                 direction = DOWN
  56.             elif direction == DOWN:
  57.                 direction = LEFT
  58.             else:
  59.                 direction = RIGHT
  60.         turning = (turning + 1) % 3
  61.     elif street == "/":
  62.         if direction == LEFT:
  63.             direction = DOWN
  64.         elif direction == RIGHT:
  65.             direction = UP
  66.         elif direction == DOWN:
  67.             direction = LEFT
  68.         else:
  69.             direction = RIGHT
  70.     elif street == "\\":
  71.         if direction == LEFT:
  72.             direction = UP
  73.         elif direction == RIGHT:
  74.             direction = DOWN
  75.         elif direction == DOWN:
  76.             direction = RIGHT
  77.         else:
  78.             direction = LEFT
  79.     return direction, turning
  80.  
  81.  
  82. def move(car, track):
  83.     x, y, direction, turning = car
  84.     delta = DELTA.get(direction, (0, 0))
  85.     x, y = x + delta[0], y + delta[1]
  86.     street = track[y][x]
  87.     if street in "+/\\":
  88.         direction, turning = turn(street, direction, turning)
  89.     car[0:4] = x, y, direction, turning
  90.  
  91.  
  92. def draw(track, cars):
  93.     print("=" * 10)
  94.     for y, row in enumerate(track):
  95.         line = ""
  96.         for x, c in enumerate(row):
  97.             for c_x, c_y, direction, turning in cars.values():
  98.                 if (c_x, c_y) == (x, y):
  99.                     c = direction
  100.                     break
  101.             line += c
  102.         print("{} {}".format(str(y).zfill(3), line))
  103.     print("=" * 10)
  104.  
  105.  
  106. track, cars = read(raw)
  107. tick, first_crash = 0, True
  108.  
  109. while True:
  110.     tick += 1
  111.     positions = dict((((x, y), car) for car, (x, y, direction, turning) in cars.items()))
  112.     to_remove = set()
  113.     for car, (x, y, direction, turning) in cars.copy().items():
  114.         move(cars[car], track)
  115.         position = (cars[car][0], cars[car][1])
  116.         if position in positions:
  117.             if first_crash:
  118.                 print("{},{}".format(*position))
  119.                 first_crash = False
  120.             to_remove.add(positions[position])
  121.             to_remove.add(car)
  122.         else:
  123.             positions.pop((x, y))
  124.         positions[position] = car
  125.     for car in to_remove:
  126.         cars.pop(car)
  127.     if len(cars) == 1:
  128.         print("{},{}".format(*cars.values()[0][:2]))
  129.         break
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top