This is so janky but fuck it. I'm not aiming for efficiency, I'm aiming to get an answer. I am slightly intimidated by Part 2.
I got there eventually.
raw_input = open("input.txt", "r")
input = raw_input.read().splitlines()
raw_input.close()
def search_up_down(line, i):
if line < 0 or line > total_lines - 1:
return 0, 0
if not input[line][i].isdigit():
lvalue = search_left(line, i - 1)
rvalue = search_right(line, i + 1)
else:
lvalue = search_right(line, i)
rvalue = 0
return lvalue, rvalue
def search_left(line, i):
if i < 0:
return 0
if not input[line][i].isdigit():
return 0
value = search_left(line, i - 1) * 10
value += int(input[line][i])
return value
def search_right(line, i):
if i <= line_width - 1:
if not input[line][i].isdigit():
value = search_left(line, i - 1)
else:
value = search_right(line, i + 1)
else:
value = search_left(line, i - 1)
return value
def gear_numbers(line, i):
up = search_up_down(line - 1, i)
down = search_up_down(line + 1, i)
left = search_left(line, i - 1)
right = search_right(line, i + 1)
return up[0], up[1], down[0], down[1], left, right
total_lines = len(input)
line_width = len(input[0])
total = 0
for line in range(total_lines):
for i in range(line_width):
if input[line][i] == "*":
gear_numbers_list = gear_numbers(line, i)
nums_to_multiply = []
for n in gear_numbers_list:
if n > 0:
nums_to_multiply.append(n)
if len(nums_to_multiply) == 2:
result = 1
for number in nums_to_multiply:
result *= number
total += result
print(total)syntax highlighting by codehost