mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-26 21:30:31 +01:00
Implement 2019 day 3
This commit is contained in:
44
2019/aoc2019/day03.py
Normal file
44
2019/aoc2019/day03.py
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
import itertools
|
||||||
|
from typing import Dict, TextIO
|
||||||
|
|
||||||
|
|
||||||
|
def compute_points(line: str) -> Dict[complex, int]:
|
||||||
|
points: Dict[complex, int] = {}
|
||||||
|
steps = itertools.count(1)
|
||||||
|
|
||||||
|
pos = complex(0)
|
||||||
|
|
||||||
|
directions = {
|
||||||
|
'U': 1j,
|
||||||
|
'R': 1,
|
||||||
|
'D': -1j,
|
||||||
|
'L': -1,
|
||||||
|
}
|
||||||
|
|
||||||
|
for move in line.strip().split(','):
|
||||||
|
direction = directions[move[0]]
|
||||||
|
|
||||||
|
for _ in range(int(move[1:])):
|
||||||
|
pos += direction
|
||||||
|
|
||||||
|
points.setdefault(pos, next(steps))
|
||||||
|
|
||||||
|
return points
|
||||||
|
|
||||||
|
|
||||||
|
def part1(data: TextIO) -> int:
|
||||||
|
points_a = compute_points(next(data))
|
||||||
|
points_b = compute_points(next(data))
|
||||||
|
|
||||||
|
in_common = set(points_a.keys()) & set(points_b.keys())
|
||||||
|
|
||||||
|
return int(min(abs(c.imag) + abs(c.real) for c in in_common))
|
||||||
|
|
||||||
|
|
||||||
|
def part2(data: TextIO) -> int:
|
||||||
|
points_a = compute_points(next(data))
|
||||||
|
points_b = compute_points(next(data))
|
||||||
|
|
||||||
|
in_common = set(points_a.keys()) & set(points_b.keys())
|
||||||
|
|
||||||
|
return min(points_a[pos] + points_b[pos] for pos in in_common)
|
||||||
25
2019/tests/test_day03.py
Normal file
25
2019/tests/test_day03.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
from io import StringIO
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from aoc2019.day03 import part1, part2
|
||||||
|
|
||||||
|
SAMPLES = [
|
||||||
|
"R8,U5,L5,D3\nU7,R6,D4,L4",
|
||||||
|
"R75,D30,R83,U83,L12,D49,R71,U7,L72\nU62,R66,U55,R34,D71,R55,D58,R83",
|
||||||
|
"R98,U47,R26,D63,R33,U87,L62,D20,R33,U53,R51\nU98,R91,D20,R16,D67,R40,U7,R15,U6,R7",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('paths,outcome', zip(SAMPLES, [6, 159, 135]))
|
||||||
|
def test_part1(paths: str, outcome: int):
|
||||||
|
path_data = StringIO(paths)
|
||||||
|
|
||||||
|
assert part1(path_data) == outcome
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('paths,outcome', zip(SAMPLES, [30, 610, 410]))
|
||||||
|
def test_part2(paths: str, outcome: int):
|
||||||
|
path_data = StringIO(paths)
|
||||||
|
|
||||||
|
assert part2(path_data) == outcome
|
||||||
Reference in New Issue
Block a user