Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sys
- tracks = []
- carts = []
- _input = open('2018/Day13/Day13.txt', 'r').readlines()
- _input1 = [
- "/->-\ ",
- "| | /----\\",
- "| /-+--+-\ |",
- "| | | | v |",
- "\-+-/ \-+--/",
- " \------/ ",
- ]
- _input2 = [
- "/>-<\ ",
- "| | ",
- "| /<+-\\",
- "| | | v",
- "\>+</ |",
- " | ^",
- " \<->/",
- ]
- for a in _input:
- if a:
- tracks.append([t for t in a])
- DX = [1,0,-1,0]
- DY = [0,-1,0,1]
- class Cart(object):
- def __init__(self, x, y, d, t):
- self.x = x
- self.y = y
- self.d = d
- self.t = t
- self.crashed = False
- def pretty(self):
- return "c: {};{} - d: {} - t: {} - crashed: {}".format(self.x, self.y, self.d, self.t, self.crashed)
- def right(self):
- self.d = (self.d - 1) % 4
- def left(self):
- self.d = (self.d - 1) % 4
- def intersect(self):
- if self.t == 0:
- self.left()
- if self.t == 2:
- self.right()
- self.t = (self.t + 1) % 3
- def specialT(self, t):
- if t == '/':
- self.d = {0:1, 1:0, 2:3, 3:2}[self.d]
- elif t == '\\':
- self.d = {0:3, 1:2, 2:1, 3:0}[self.d]
- elif t == '+':
- self.intersect()
- def prune(self):
- carts.remove(self)
- def fwd(self):
- newX = self.x + DX[self.d]
- newY = self.y + DY[self.d]
- # If crashes
- if (newX, newY) in [(a.x,a.y) for a in carts]:
- # print('Crash in: {},{}'.format(newX, newY))
- for k in carts:
- if newX == k.x and newY == k.y:
- k.crashed = True
- self.crashed = True
- return False, k
- else:
- # If special track
- self.specialT(tracks[newY][newX])
- # Assign new coordinates
- self.x, self.y = newX, newY
- return True, self
- def showTracks():
- for r in range(len(tracks)):
- for c in range(len(tracks[r])):
- isCart = False
- for cart in carts:
- if cart.crashed: continue
- if (cart.x, cart.y) == (c,r):
- print({0: '>', 1:'^', 2:'<', 3:'v'}[cart.d], end='')
- isCart = True
- if not isCart:
- print(tracks[r][c], end = '')
- print()
- for r in range(len(tracks)):
- for c in range(len(tracks[r])):
- if tracks[r][c] == '>':
- tracks[r][c] = '-'
- carts.append(Cart(c,r,0,0))
- if tracks[r][c] == '^':
- tracks[r][c] = '|'
- carts.append(Cart(c,r,1,0))
- if tracks[r][c] == '<':
- tracks[r][c] = '-'
- carts.append(Cart(c,r,2,0))
- if tracks[r][c] == 'v':
- tracks[r][c] = '|'
- carts.append(Cart(c,r,3,0))
- cpt = -1
- while 1:
- # # showTracks()
- if len(carts) == 1:
- print('Part 2: {},{}'.format(carts[0].x, carts[0].y))
- sys.exit(0)
- newCarts = []
- for c in carts:
- if c.crashed: continue
- # print(c.pretty(), end = ' --> ')
- survived, cart = c.fwd()
- if survived:
- # print(c.pretty())
- newCarts.append(cart)
- else:
- print("Crashed in {};{}".format(cart.x, cart.y))
- carts = sorted([c for c in newCarts if not c.crashed], key=lambda cart:(cart.y, cart.x))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement