79 lines
1.5 KiB
Python
79 lines
1.5 KiB
Python
|
|
|
|
def is_symbol(c):
|
|
symbols = list("+-*/=#%&$@")
|
|
res = c in symbols
|
|
return res
|
|
|
|
def get_num(row, col):
|
|
cursor = col
|
|
num = 0
|
|
num_left = -1
|
|
num_right = -1
|
|
|
|
if file[row][col].isdigit():
|
|
num_left = cursor
|
|
while file[row][cursor].isdigit() and cursor >= 0:
|
|
num_left = cursor
|
|
cursor -= 1
|
|
cursor = col
|
|
while file[row][cursor].isdigit() and cursor <= len(file[row]):
|
|
num_right = cursor
|
|
cursor += 1
|
|
num = int(file[row][num_left:num_right+1])
|
|
|
|
s = list(file[row])
|
|
for i in range(num_left, num_right+1):
|
|
s[i] = "."
|
|
file[row] = "".join(s)
|
|
return num
|
|
|
|
|
|
def get_adj_numbers_sum(row, col):
|
|
partial_sum = 0
|
|
gear_product = 0
|
|
gear_product_parts = []
|
|
|
|
tl = get_num(row-1, col-1)
|
|
t = get_num(row+1, col)
|
|
tr = get_num(row-1, col+1)
|
|
|
|
l = get_num(row, col-1)
|
|
r = get_num(row, col+1)
|
|
|
|
bl = get_num(row+1, col-1)
|
|
b = get_num(row-1, col)
|
|
br = get_num(row+1, col+1)
|
|
|
|
adj = [tl,t,tr,l,r,bl,b,br]
|
|
|
|
if file[row][col] == "*":
|
|
for i in range(len(adj)):
|
|
if adj[i] >= 1:
|
|
gear_product_parts.append(adj[i])
|
|
if len(gear_product_parts) == 2:
|
|
gear_product = gear_product_parts[0] * gear_product_parts[1]
|
|
|
|
partial_sum = tl+t+tr+l+r+bl+b+br
|
|
|
|
return partial_sum, gear_product
|
|
|
|
|
|
def solve(file):
|
|
part_1 = 0
|
|
part_2 = 0
|
|
|
|
for i in range(1, len(file)-1):
|
|
for j in range(len(file[i])):
|
|
if is_symbol(file[i][j]):
|
|
res = get_adj_numbers_sum(i, j)
|
|
part_1, part_2 = part_1 + res[0], part_2 + res[1]
|
|
|
|
return part_1, part_2
|
|
|
|
|
|
file = open("input.txt", "r").readlines()
|
|
|
|
ans1, ans2 = solve(file)
|
|
print(f"Part 1: {ans1}\nPart 2: {ans2}")
|