This commit is contained in:
Stefan Harmuth 2023-12-03 09:48:25 +01:00
parent c7294385cd
commit 5d91b0c64d

View File

@ -9,15 +9,17 @@ class Day(AOCDay):
inputs = [ inputs = [
[ [
(4361, "input3_test"), (4361, "input3_test"),
(None, "input3"), (560670, "input3"),
], ],
[ [
(None, "input3"), (467835, "input3_test"),
(91622824, "input3"),
], ],
] ]
def parse_input(self) -> Grid: def parse_input(self) -> Grid:
grid = Grid() grid = Grid()
num_found = 0
for y, l in enumerate(self.getInput()): for y, l in enumerate(self.getInput()):
number_digits = set() number_digits = set()
number = 0 number = 0
@ -28,44 +30,64 @@ class Day(AOCDay):
else: else:
if number_digits: if number_digits:
for nc in number_digits: for nc in number_digits:
grid.set(Coordinate(*nc), number) grid.set(Coordinate(*nc), (num_found, number))
num_found += 1
number_digits = set() number_digits = set()
number = 0 number = 0
if c != ".": if c != ".":
grid.set(Coordinate(x, y), c) grid.set(Coordinate(x, y), c)
if number_digits:
for nc in number_digits:
grid.set(Coordinate(*nc), (num_found, number))
num_found += 1
return grid return grid
def part1(self) -> Any: def part1(self) -> Any:
grid = self.parse_input() grid = self.parse_input()
sum = 0 part_number_sum = 0
seen = set() seen = set()
for y in grid.rangeY(): for c in grid.getActiveCells():
for x in grid.rangeX(): v = grid.get(c)
if Coordinate(x, y) in seen: if not isinstance(v, tuple):
continue 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) num_id, num_value = v
for n in grid.getNeighboursOf(num_c, includeDiagonal=True, includeDefault=False): if num_id in seen:
if not found and grid.get(n) != c: # and not isinstance(grid.get(n), int): continue
print(f"{c} has {grid.get(n)} at {n}")
sum += c
found = True
break
return sum for n in grid.getNeighboursOf(c, includeDefault=False, includeDiagonal=True):
nv = grid.get(n)
if nv and not isinstance(nv, tuple):
part_number_sum += num_value
seen.add(num_id)
break
return part_number_sum
def part2(self) -> Any: def part2(self) -> Any:
return "" grid = self.parse_input()
gear_ratio_sum = 0
for c in grid.getActiveCells():
if grid.get(c) != "*":
continue
count = 0
ratio = 1
seen = set()
for n in grid.getNeighboursOf(c, includeDiagonal=True, includeDefault=False):
num = grid.get(n)
if num and isinstance(num, tuple) and num[0] not in seen:
ratio *= num[1]
count += 1
seen.add(num[0])
if count == 2:
gear_ratio_sum += ratio
return gear_ratio_sum
if __name__ == "__main__": if __name__ == "__main__":