advent-of-code/2019-python/output/day_03.py

68 lines
1.4 KiB
Python
Raw Normal View History

2023-11-21 14:44:16 +01:00
from collections import defaultdict
2023-12-19 18:34:03 +01:00
from output import answer
2023-11-21 14:44:16 +01:00
n = 3
title = "Crossed Wires"
directions = {
"U": (-1, 0),
"R": (0, 1),
"D": (1, 0),
"L": (0, -1),
}
@answer(
1, "As the crow flies, closest intersection Manhattan distance is {} units away"
)
2023-12-19 18:34:03 +01:00
def part_1(o):
return o[0]
2023-11-21 14:44:16 +01:00
2023-12-19 18:34:03 +01:00
@answer(2, "By travel, closest intersection Manhattan distance is {} units away")
def part_2(o):
return o[1]
2023-11-21 14:44:16 +01:00
2023-12-19 18:34:03 +01:00
def solve(inp):
wires = [line.split(",") for line in inp.split()]
2023-11-21 14:44:16 +01:00
seen = defaultdict(dict)
def follow(instructions, i):
2023-12-19 18:34:03 +01:00
visited = []
2023-11-21 14:44:16 +01:00
steps = 0
pos = (0, 0)
for instruction in instructions:
urdl, *l = instruction
distance = int("".join(l))
for _ in range(distance):
steps += 1
pos = (pos[0] + directions[urdl][0], pos[1] + directions[urdl][1])
2023-12-19 18:34:03 +01:00
visited.append(pos)
2023-11-21 14:44:16 +01:00
if i not in seen[pos]:
seen[pos][i] = steps
2023-12-19 18:34:03 +01:00
return set(visited)
2023-11-21 14:44:16 +01:00
2023-12-19 18:34:03 +01:00
p1w = []
2023-11-21 14:44:16 +01:00
for i, wire in enumerate(wires):
2023-12-19 18:34:03 +01:00
p1w.append(follow(wire, i))
p1 = min(sum(map(abs, i)) for i in p1w[0] & p1w[1])
p2 = min(sum(v.values()) for v in seen.values() if len(v) > 1)
2023-11-21 14:44:16 +01:00
2023-12-19 18:34:03 +01:00
return p1, p2
2023-11-21 14:44:16 +01:00
if __name__ == "__main__":
2023-12-19 18:34:03 +01:00
with open("./input/03.txt", "r") as f:
inp = f.read().strip()
inp = solve(inp)
a = part_1(inp)
b = part_2(inp)
assert a == 1337
assert b == 65356