File size: 1,631 Bytes
a4da721
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
def parse_input(filename):
    equations = []
    with open(filename, 'r') as f:
        for line in f:
            test_value, numbers = line.strip().split(': ')
            test_value = int(test_value)
            numbers = [int(x) for x in numbers.split()]
            equations.append((test_value, numbers))
    return equations

def evaluate(numbers, operators):
    result = numbers[0]
    for i, op in enumerate(operators):
        if op == '+':
            result += numbers[i + 1]
        elif op == '*':
            result *= numbers[i + 1]
        elif op == '||':
            result = int(str(result) + str(numbers[i + 1]))
    return result

def try_all_combinations(test_value, numbers, operators_set):
    if len(numbers) == 1:
        return test_value == numbers[0]
    
    n = len(numbers) - 1  # number of operators needed
    for ops in itertools.product(operators_set, repeat=n):
        if evaluate(numbers, ops) == test_value:
            return True
    return False

import itertools

def solve_part1(equations):
    total = 0
    operators = ['+', '*']
    
    for test_value, numbers in equations:
        if try_all_combinations(test_value, numbers, operators):
            total += test_value
    
    return str(total)

def solve_part2(equations):
    total = 0
    operators = ['+', '*', '||']
    
    for test_value, numbers in equations:
        if try_all_combinations(test_value, numbers, operators):
            total += test_value
    
    return str(total)

# Read input and solve both parts
equations = parse_input("./input.txt")
print(solve_part1(equations))
print(solve_part2(equations))