|
|
@ -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]: |
|
|
|