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 = [
|
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__":
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user