Add day 3
This commit is contained in:
parent
f72708ca06
commit
4676f68466
1 changed files with 76 additions and 0 deletions
76
day03.py
Normal file
76
day03.py
Normal file
|
@ -0,0 +1,76 @@
|
|||
import fileinput
|
||||
from pprint import pprint
|
||||
|
||||
inp = []
|
||||
|
||||
for line in fileinput.input():
|
||||
if line:
|
||||
inp.append(list(line.strip()))
|
||||
|
||||
numbers = {}
|
||||
gear_numbers = {}
|
||||
|
||||
def moore(x, y):
|
||||
for j in (-1, 0, 1):
|
||||
for i in (-1, 0, 1):
|
||||
if (
|
||||
not (i == 0 and j == 0)
|
||||
and 0 <= (y + j) < len(inp)
|
||||
and 0 <= (x + i) < len(inp[y + j])
|
||||
):
|
||||
yield (x + i, y + j)
|
||||
|
||||
|
||||
for y in range(len(inp)):
|
||||
for x in range(len(inp[y])):
|
||||
if inp[y][x].isdigit():
|
||||
while x >= 0 and inp[y][x].isdigit():
|
||||
x -= 1
|
||||
x += 1
|
||||
|
||||
if (x, y) in numbers:
|
||||
continue
|
||||
|
||||
is_part_number = False
|
||||
gear = None
|
||||
|
||||
x_ = x
|
||||
number = 0
|
||||
|
||||
while x_ < len(inp[y]) and inp[y][x_].isdigit():
|
||||
number = number * 10 + int(inp[y][x_])
|
||||
|
||||
for i, j in moore(x_, y):
|
||||
if not inp[j][i].isdigit() and inp[j][i] != ".":
|
||||
is_part_number = True
|
||||
if inp[j][i] == "*": gear = (i, j)
|
||||
break
|
||||
|
||||
x_ += 1
|
||||
|
||||
if gear and (x, y) not in gear_numbers:
|
||||
gear_number = 0
|
||||
|
||||
for i, j in moore(*gear):
|
||||
if inp[j][i].isdigit():
|
||||
while j >= 0 and inp[j][i].isdigit():
|
||||
i -= 1
|
||||
i += 1
|
||||
|
||||
if (i, j) in gear_numbers:
|
||||
break
|
||||
|
||||
if (x, y) != (i, j):
|
||||
i_ = i
|
||||
while i_ < len(inp[j]) and inp[j][i_].isdigit():
|
||||
gear_number = gear_number * 10 + int(inp[j][i_])
|
||||
i_ += 1
|
||||
gear_number *= number
|
||||
gear_numbers[(x, y)] = gear_number
|
||||
break
|
||||
|
||||
numbers[(x, y)] = (number, is_part_number, gear)
|
||||
|
||||
part1 = sum(num for (num, ispart, _) in numbers.values() if ispart)
|
||||
part2 = sum(gear_numbers.values())
|
||||
print(part1, part2)
|
Loading…
Reference in a new issue