Files
aoc-py/src/solution/year_2019/day_03.py

53 lines
1.1 KiB
Python

import collections
from typing import Any
DIR_MAP = {
"U": (0, -1),
"D": (0, 1),
"L": (-1, 0),
"R": (1, 0),
}
def _parse_input(input_data: str) -> list[list[tuple[str, int]]]:
wires = []
for line in input_data.splitlines():
wire = [(w[0], int(w[1:])) for w in line.split(",")]
wires.append(wire)
return wires
def part_1_2(input_data: str) -> Any:
wires = _parse_input(input_data)
locs = collections.defaultdict(dict)
m1 = None
m2 = None
for wid, wire in enumerate(wires):
x, y, w = 0, 0, 0
for direction, distance in wire:
dx, dy = DIR_MAP[direction]
for _ in range(distance):
w += 1
x += dx
y += dy
loc = locs[(x, y)]
loc.setdefault(wid, w)
if len(loc) == 2:
d1 = abs(x) + abs(y)
m1 = min(m1 or d1, d1)
d2 = loc[0] + loc[1]
m2 = min(m2 or d2, d2)
return m1, m2
def test_part_1_2(example_data):
assert part_1_2(example_data) == (159, 610)