diff --git a/puzzles/day05.py b/puzzles/day05.py index d30fce7..cf883a8 100644 --- a/puzzles/day05.py +++ b/puzzles/day05.py @@ -38,15 +38,15 @@ class VolcanicVent: class Chart: + chart: Dict = None vents: List = None - diagram: Dict = None - def __init__(self, vents: List[VolcanicVent]) -> None: - self.diagram = defaultdict(int) + def __init__(self, vents: List[VolcanicVent], diagnals: bool = True) -> None: + self.chart = defaultdict(int) self.vents = vents - self._generate_diagram() + self._generate_chart(diagnals=diagnals) - def _generate_diagram(self) -> None: + def _generate_chart(self, diagnals: bool = True) -> None: """ .......1.. ..1....1.. @@ -59,32 +59,48 @@ class Chart: .......... 222111.... 0,9 -> 5,9 0,9 -> 2,9 """ - vents = self.vents.copy() for vent in vents: if vent.direction != "diagnal": - min_x = min(vent.start.x, vent.end.x) - max_x = max(vent.start.x, vent.end.x) - min_y = min(vent.start.y, vent.end.y) - max_y = max(vent.start.y, vent.end.y) - - for x in range(min_x, max_x + 1): - for y in range(min_y, max_y + 1): - self.diagram[x, y] += 1 - else: - pass + self._chart_line_horiz_vert(vent.start, vent.end) + elif diagnals: + self._chart_line_diagnal(vent.start, vent.end) + + def _chart_line_diagnal(self, start: Location, end: Location) -> None: + if end.x > start.x: # direction: left + x_range = range(start.x, end.x + 1) + else: # direction: right + x_range = range(start.x, end.x - 1, -1) # reverse range + if end.y > start.y: # direction: down + y_range = range(start.y, end.y + 1) + else: # direction: up + y_range = range(start.y, end.y - 1, -1) # reverse range + + for x, y in zip(x_range, y_range): + self.chart[x, y] += 1 + + def _chart_line_horiz_vert(self, start: Location, end: Location) -> None: + min_x = min(start.x, end.x) + max_x = max(start.x, end.x) + min_y = min(start.y, end.y) + max_y = max(start.y, end.y) + + for x in range(min_x, max_x + 1): + for y in range(min_y, max_y + 1): + self.chart[x, y] += 1 def calculate_overlaps(self, max_depth: int = 1) -> int: - return sum(depth_count > max_depth for depth_count in self.diagram.values()) + return sum(depth_count > max_depth for depth_count in self.chart.values()) def part1(inputs: List[int]) -> int: - c = Chart(inputs) + c = Chart(inputs, diagnals=False) return c.calculate_overlaps() def part2(inputs: List[int]) -> int: - return False + c = Chart(inputs) + return c.calculate_overlaps() def parse(inputs: str) -> List[int]: diff --git a/puzzles/test_day05.py b/puzzles/test_day05.py index 1f2b468..f78a5e0 100644 --- a/puzzles/test_day05.py +++ b/puzzles/test_day05.py @@ -20,15 +20,13 @@ def test_example1(example_data): assert aoc.part1(example_data) == 5 -@pytest.mark.skip(reason="Not implemented") def test_example2(example_data): - assert aoc.part2(example_data) == ... + assert aoc.part2(example_data) == 12 def test_part1(day05_data): assert aoc.part1(day05_data) == 6572 -@pytest.mark.skip(reason="Not implemented") def test_part2(day05_data): - assert aoc.part2(day05_data) == ... + assert aoc.part2(day05_data) == 21466