2024-12-09 16:50:28 -06:00

55 lines
1.6 KiB
Python

import time
start_time = time.time()
with open('puzzle.txt', 'r') as f:
lines = f.read().splitlines()
import operator
operations = {
0: operator.add,
1: operator.mul,
2: operator.concat
}
def operator_increment(depth, result, value_list, operator_list, operation_list):
for calc_operator in operator_list:
if depth == 0:
calc = value_list[0]
for index, value in enumerate(value_list[:-1]):
if operator_list[operation_list[-index]] == operator.concat:
calc = int(str(calc) + str(value_list[index + 1]))
else:
calc = operator_list[operation_list[-index]](calc, value_list[index + 1])
if calc == result:
return True, calc
else:
operation_list[depth - 1] = calc_operator
return_status, calc = operator_increment(depth - 1, result, value_list, operator_list, operation_list)
if return_status:
return return_status, calc
return False, 0
values = {}
for line in lines:
test_value, equation_values = line.split(':')
test_value = int(test_value)
equation_values = list(map(int, equation_values.strip().split(' ')))
values.update({test_value: equation_values})
total_calibration = 0
for result in values:
operation_list = [None] * (len(values[result]) - 1)
return_status, calc = operator_increment(len(values[result])-1, result, values[result], operations, operation_list)
if return_status:
total_calibration += calc
print(total_calibration)
print(f'Total time: {time.time() - start_time}')