Del ett var okay, men del två blev bara hemsk. Aja. Det blev rätt tillslut.
def create_track(track, height=150, width=150):
matrix = [[" " for i in range(height)] for j in range(width)]
carts = []
r = 0
c = 0
for t in list(track):
if t == "\n":
r += 1
c = 0
continue
if t in ["^","v"]:
matrix[r][c] = "|"
carts.append((r, c, t, "l", 1))
elif t in ["<",">"]:
matrix[r][c] = "-"
carts.append((r, c, t, "l", 1))
else:
matrix[r][c] = t
c = (c+1) % width
return matrix, carts
def print_track(track, carts=[], height=150, width=150):
for r in range(height):
for c in range(width):
found, _, cart = find_cart(track, carts, r, c)
if found:
print(cart[2], end="")
else:
print(track[r][c], end="")
print()
def find_cart(track, carts, r, c):
for i, cart in enumerate(carts):
y = cart[0]
x = cart[1]
if y == r and x == c:
return True, i, cart
return False, False, False
def drive(track, carts, height=150, width=150, show=True):
counter = 0
done = False
pos = []
carts = sorted(carts, key=lambda c: (c[0], c[1]))
while True:
if show:
print_track(track, carts, height, width)
for i, cart in enumerate(carts):
carts = move_cart(track, carts, i, height, width)
carts = detect_collision(carts)
if one_left(carts):
break
carts = [c for c in carts if c[-1] is not 0]
carts = sorted(carts, key=lambda c: (c[0], c[1]))
carts = [c for c in carts if c[-1] is not 0]
return carts
def one_left(carts):
not_crashed = len(carts)
for cart in carts:
if cart[-1] == 0:
not_crashed -= 1
if not_crashed == 1:
return True
return False
def detect_collision(carts):
for i, cart1 in enumerate(carts):
if cart1[-1] == 0:
continue
p1 = (cart1[0], cart1[1])
for j, cart2 in enumerate(carts):
p2 = (cart2[0], cart2[1])
if cart2[-1] == 0:
continue
if i != j:
if p1 == p2:
print(f"Crash on pos: {cart1[1]},{cart1[0]}")
carts[i] = (carts[i][0], carts[i][1], carts[i][2], carts[i][3], 0)
carts[j] = (carts[i][0], carts[i][1], carts[i][2], carts[i][3], 0)
return carts
def move_cart(track, carts, i, height, width):
cart = carts[i] # (row, col, dir, next turn)
r = cart[0]
c = cart[1]
d = cart[2]
n = cart[3]
a = cart[4]
# going up
if d == "^":
if track[r-1][c] == "|":
carts[i] = (r-1, c, d, n, a)
elif track[r-1][c] == "\\":
carts[i] = (r-1, c, "<", n, a)
elif track[r-1][c] == "/":
carts[i] = (r-1, c, ">", n, a)
elif track[r-1][c] == "+":
if n == "l":
carts[i] = (r-1, c, "<", "s", a)
elif n == "s":
carts[i] = (r-1, c, "^", "r", a)
elif n == "r":
carts[i] = (r-1, c, ">", "l", a)
# going down
if d == "v":
if track[r+1][c] == "|":
carts[i] = (r+1, c, d, n, a)
elif track[r+1][c] == "\\":
carts[i] = (r+1, c, ">", n, a)
elif track[r+1][c] == "/":
carts[i] = (r+1, c, "<", n, a)
elif track[r+1][c] == "+":
if n == "l":
carts[i] = (r+1, c, ">", "s", a)
elif n == "s":
carts[i] = (r+1, c, "v", "r", a)
elif n == "r":
carts[i] = (r+1, c, "<", "l", a)
# going left
if d == "<":
if track[r][c-1] == "-":
carts[i] = (r, c-1, d, n, a)
elif track[r][c-1] == "\\":
carts[i] = (r, c-1, "^", n, a)
elif track[r][c-1] == "/":
carts[i] = (r, c-1, "v", n, a)
elif track[r][c-1] == "+":
if n == "l":
carts[i] = (r, c-1, "v", "s", a)
elif n == "s":
carts[i] = (r, c-1, "<", "r", a)
elif n == "r":
carts[i] = (r, c-1, "^", "l", a)
# going right
if d == ">":
if track[r][c+1] == "-":
carts[i] = (r, c+1, d, n, a)
elif track[r][c+1] == "\\":
carts[i] = (r, c+1, "v", n, a)
elif track[r][c+1] == "/":
carts[i] = (r, c+1, "^", n, a)
elif track[r][c+1] == "+":
if n == "l":
carts[i] = (r, c+1, "^", "s", a)
elif n == "s":
carts[i] = (r, c+1, ">", "r", a)
elif n == "r":
carts[i] = (r, c+1, "v", "l", a)
return carts
def task_1(data):
height = 150
width = 150
track, carts = create_track(data, height, width)
carts = drive(track, carts, height, width, False)
carts = [c for c in carts if c[-1] is not 0]
return(f"Last standing cart: {carts[0]}")
## MAIN ##
if __name__ == "__main__":
data = get_input(13)
print(f"result: {task_1(data)}")