Solve 2018 day 13

This commit is contained in:
felixm 2024-07-13 11:24:58 -04:00
parent f04f8ed426
commit 5e68e08807
2 changed files with 104 additions and 1 deletions

102
2018/d13.py Normal file
View File

@ -0,0 +1,102 @@
from lib import Grid2D, add2
CARTS = (
("^", Grid2D.N, "|"),
("v", Grid2D.S, "|"),
(">", Grid2D.E, "-"),
("<", Grid2D.W, "-"),
)
TURNS = "lsr"
DIRS = [(-1, 0), (0, 1), (1, 0), (0, -1)]
def part_1(data):
g = Grid2D(data)
first_shown = False
carts = []
occupied = set()
for c, d, r in CARTS:
for cart in g.find(c):
carts.append((cart, d, "l"))
g[cart] = r
occupied.add(cart)
for _ in range(1, 100_000):
carts = sorted(carts)
ncarts = []
i_to_skip = []
for i in range(len(carts)):
if i in i_to_skip:
continue
pos, dir, turn = carts[i]
occupied.remove(pos)
pos = add2(pos, dir)
# detect collision and remove carts
if pos in occupied:
if first_shown is False:
print(f"{pos[1]},{pos[0]}")
first_shown = True
# either from carts that haven't moved, yet
for j in range(len(carts)):
jpos, _, _ = carts[j]
if jpos == pos:
i_to_skip.append(j)
break
else:
# or from carts that have already moved
ncarts = list(filter(lambda c: c[0] != pos, ncarts))
occupied.remove(pos)
continue
else:
occupied.add(pos)
if g[pos] == "+":
if turn == "l":
dir = DIRS[(DIRS.index(dir) - 1) % len(DIRS)]
elif turn == "r":
dir = DIRS[(DIRS.index(dir) + 1) % len(DIRS)]
turn = TURNS[(TURNS.index(turn) + 1) % len(TURNS)]
elif g[pos] == "/":
if dir == g.E:
dir = g.N
elif dir == g.W:
dir = g.S
elif dir == g.N:
dir = g.E
elif dir == g.S:
dir = g.W
else:
assert False
elif g[pos] == "\\":
if dir == g.E:
dir = g.S
elif dir == g.W:
dir = g.N
elif dir == g.N:
dir = g.W
elif dir == g.S:
dir = g.E
else:
assert False
ncarts.append((pos, dir, turn))
carts = ncarts
if len(carts) == 1:
pos = carts[0][0]
print(f"{pos[1]},{pos[0]}")
return
def main():
input_file = __file__.replace(".py", ".txt")
with open(input_file) as f:
data = f.read()
part_1(data)
if __name__ == "__main__":
main()

View File

@ -101,7 +101,8 @@ written in Python.
- Day 10: 19:14
- Day 11: 22:52
- Day 12: 180:00
- Day 13:
- Day 13: 73:09
- Day 14:
# 2022