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)