Update day03.py

This commit is contained in:
Sijmen 2023-12-05 09:59:06 +00:00
parent 4676f68466
commit 9c48228a3f
1 changed files with 54 additions and 41 deletions

View File

@ -10,6 +10,7 @@ for line in fileinput.input():
numbers = {} numbers = {}
gear_numbers = {} gear_numbers = {}
def moore(x, y): def moore(x, y):
for j in (-1, 0, 1): for j in (-1, 0, 1):
for i in (-1, 0, 1): for i in (-1, 0, 1):
@ -23,7 +24,9 @@ def moore(x, y):
for y in range(len(inp)): for y in range(len(inp)):
for x in range(len(inp[y])): for x in range(len(inp[y])):
if inp[y][x].isdigit(): if not inp[y][x].isdigit():
continue
while x >= 0 and inp[y][x].isdigit(): while x >= 0 and inp[y][x].isdigit():
x -= 1 x -= 1
x += 1 x += 1
@ -43,16 +46,24 @@ for y in range(len(inp)):
for i, j in moore(x_, y): for i, j in moore(x_, y):
if not inp[j][i].isdigit() and inp[j][i] != ".": if not inp[j][i].isdigit() and inp[j][i] != ".":
is_part_number = True is_part_number = True
if inp[j][i] == "*": gear = (i, j) if inp[j][i] == "*":
gear = (i, j)
break break
x_ += 1 x_ += 1
if gear and (x, y) not in gear_numbers: if is_part_number:
numbers[(x, y)] = number
if not gear or (x, y) in gear_numbers:
continue
gear_number = 0 gear_number = 0
for i, j in moore(*gear): for i, j in moore(*gear):
if inp[j][i].isdigit(): if not inp[j][i].isdigit():
continue
while j >= 0 and inp[j][i].isdigit(): while j >= 0 and inp[j][i].isdigit():
i -= 1 i -= 1
i += 1 i += 1
@ -60,17 +71,19 @@ for y in range(len(inp)):
if (i, j) in gear_numbers: if (i, j) in gear_numbers:
break break
if (x, y) != (i, j): if (x, y) == (i, j):
continue
i_ = i i_ = i
while i_ < len(inp[j]) and inp[j][i_].isdigit(): while i_ < len(inp[j]) and inp[j][i_].isdigit():
gear_number = gear_number * 10 + int(inp[j][i_]) gear_number = gear_number * 10 + int(inp[j][i_])
i_ += 1 i_ += 1
gear_number *= number gear_number *= number
gear_numbers[(x, y)] = gear_number gear_numbers[(x, y)] = gear_number
break break
numbers[(x, y)] = (number, is_part_number, gear)
part1 = sum(num for (num, ispart, _) in numbers.values() if ispart) part1 = sum(numbers.values())
part2 = sum(gear_numbers.values()) part2 = sum(gear_numbers.values())
print(part1, part2) print(part1, part2)