generated from public/aoc_template
Day 3
This commit is contained in:
parent
c7294385cd
commit
5d91b0c64d
72
day03.py
72
day03.py
@ -9,15 +9,17 @@ class Day(AOCDay):
|
||||
inputs = [
|
||||
[
|
||||
(4361, "input3_test"),
|
||||
(None, "input3"),
|
||||
(560670, "input3"),
|
||||
],
|
||||
[
|
||||
(None, "input3"),
|
||||
(467835, "input3_test"),
|
||||
(91622824, "input3"),
|
||||
],
|
||||
]
|
||||
|
||||
def parse_input(self) -> Grid:
|
||||
grid = Grid()
|
||||
num_found = 0
|
||||
for y, l in enumerate(self.getInput()):
|
||||
number_digits = set()
|
||||
number = 0
|
||||
@ -28,44 +30,64 @@ class Day(AOCDay):
|
||||
else:
|
||||
if 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 = 0
|
||||
|
||||
if 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
|
||||
|
||||
def part1(self) -> Any:
|
||||
grid = self.parse_input()
|
||||
sum = 0
|
||||
part_number_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
|
||||
for c in grid.getActiveCells():
|
||||
v = grid.get(c)
|
||||
if not isinstance(v, tuple):
|
||||
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
|
||||
num_id, num_value = v
|
||||
if num_id in seen:
|
||||
continue
|
||||
|
||||
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:
|
||||
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__":
|
||||
|
||||
Loading…
Reference in New Issue
Block a user