From 909b3c63d0f67e2bd5aa0971c1016aa229c3e2f5 Mon Sep 17 00:00:00 2001
From: Ryan Reed <git@ryanreed.net>
Date: Sun, 5 Dec 2021 15:14:19 -0500
Subject: [PATCH] Reworking for part 2

---
 puzzles/day05.py      | 54 ++++++++++++++++++++++++++++---------------
 puzzles/test_day05.py |  6 ++---
 2 files changed, 37 insertions(+), 23 deletions(-)

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