"""
|
|
Advent of Code 2021 - Day 09
|
|
|
|
Run with:
|
|
python puzzles/day09.py inputs/day09.txt
|
|
"""
|
|
|
|
import pathlib
|
|
import sys
|
|
from typing import List, Tuple
|
|
|
|
|
|
class Heightmap:
|
|
low_point_values = None
|
|
|
|
def __init__(self, data: List[List[int]]) -> None:
|
|
self.heightmap = data
|
|
|
|
def find_low_points(self):
|
|
self.low_point_values = []
|
|
max_y = len(self.heightmap)-1
|
|
max_x = len(self.heightmap[0])-1
|
|
for y, row in enumerate(self.heightmap):
|
|
for x, value in enumerate(row):
|
|
if x > 0 and self.heightmap[y][x-1] <= value:
|
|
continue
|
|
elif x != max_x and self.heightmap[y][x+1] <= value:
|
|
continue
|
|
elif y > 0 and self.heightmap[y-1][x] <= value:
|
|
continue
|
|
elif y != max_y and self.heightmap[y+1][x] <= value:
|
|
continue
|
|
|
|
self.low_point_values.append((x,y))
|
|
|
|
def calculate_risk_score(self):
|
|
if self.low_point_values is None:
|
|
self.find_low_points()
|
|
|
|
return sum(self.heightmap[coords[1]][coords[0]]+1 for coords in self.low_point_values)
|
|
|
|
|
|
def part1(inputs: List[int]) -> int:
|
|
h = Heightmap(inputs)
|
|
return h.calculate_risk_score()
|
|
|
|
|
|
def part2(inputs: List[int]) -> int:
|
|
return False
|
|
|
|
|
|
def parse(inputs: str) -> List[int]:
|
|
"""Parse the input string"""
|
|
return [[int(num) for num in line] for line in inputs.split()]
|
|
|
|
|
|
def solve(path: str) -> Tuple[int, int]:
|
|
"""Solve the puzzle"""
|
|
puzzle_input = parse(pathlib.Path(path).read_text().strip())
|
|
part1_result = part1(puzzle_input)
|
|
part2_result = part2(puzzle_input)
|
|
|
|
return part1_result, part2_result
|
|
|
|
|
|
def main() -> None:
|
|
for path in sys.argv[1:]:
|
|
print(f"Input File: {path}")
|
|
|
|
part1_result, part2_result = solve(path)
|
|
|
|
print(f"Part 1 Result: {part1_result}")
|
|
print(f"Part 2 Result: {part2_result}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|