aoc2023/day03.py

74 lines
2.1 KiB
Python

from tools.aoc import AOCDay
from typing import Any
from tools.coordinate import Coordinate
from tools.grid import Grid
class Day(AOCDay):
inputs = [
[
(4361, "input3_test"),
(None, "input3"),
],
[
(None, "input3"),
],
]
def parse_input(self) -> Grid:
grid = Grid()
for y, l in enumerate(self.getInput()):
number_digits = set()
number = 0
for x, c in enumerate(l):
if c.isdigit():
number_digits.add((x, y))
number = number * 10 + int(c)
else:
if number_digits:
for nc in number_digits:
grid.set(Coordinate(*nc), number)
number_digits = set()
number = 0
if c != ".":
grid.set(Coordinate(x, y), c)
return grid
def part1(self) -> Any:
grid = self.parse_input()
sum = 0
seen = set()
for y in grid.rangeY():
for x in grid.rangeX():
if Coordinate(x, y) in seen:
continue
c = grid.get(Coordinate(x, y))
if c and isinstance(c, int):
print(f"investigate {c} at {x}, {y}")
found = False
for dx in range(len(str(c))):
num_c = Coordinate(x + dx, y)
if num_c in seen:
continue
seen.add(num_c)
for n in grid.getNeighboursOf(num_c, includeDiagonal=True, includeDefault=False):
if not found and grid.get(n) != c: # and not isinstance(grid.get(n), int):
print(f"{c} has {grid.get(n)} at {n}")
sum += c
found = True
break
return sum
def part2(self) -> Any:
return ""
if __name__ == "__main__":
day = Day(2023, 3)
day.run(verbose=True)