1
+ import operator as op
2
+ import itertools
3
+
4
+ def load_input (filename : str ) -> list :
5
+ with open (filename , "r" ) as file :
6
+ lines = file .readlines ()
7
+ return [line .strip () for line in lines ]
8
+
9
+
10
+ def process_input (lines ):
11
+ answers = []
12
+ values = []
13
+ for line in lines :
14
+ _answer , _values = line .split (": " )
15
+ answers .append (int (_answer ))
16
+ values .append ([int (x ) for x in _values .split (" " )])
17
+
18
+ return answers , values
19
+
20
+ def check_equation (answer , values , pos_operators = [op .add , op .mul ]):
21
+ Noperators = len (values ) - 1
22
+
23
+ operator_list = itertools .product (pos_operators , repeat = Noperators )
24
+
25
+ for op_list in operator_list :
26
+ result = values [0 ]
27
+ for op , val in zip (op_list , values [1 :]):
28
+ result = op (result , val )
29
+ if result == answer :
30
+ return True
31
+
32
+ def concatenate_operator (a , b ):
33
+ return int (str (a ) + str (b ))
34
+
35
+
36
+ def do_puzzle (answer , values , pos_operators ):
37
+ # Find which equations are possible
38
+ possible = []
39
+ for answer , value in zip (answers , values ):
40
+ if check_equation (answer , value , pos_operators = pos_operators ):
41
+ possible .append (True )
42
+ else :
43
+ possible .append (False )
44
+
45
+ # Sum possible answers
46
+ total = 0
47
+ for answer , value , is_possible in zip (answers , values , possible ):
48
+ if is_possible :
49
+ total += answer
50
+ print (f"Total possible answers: { total } " )
51
+
52
+
53
+ if __name__ == "__main__" :
54
+ input_lines = load_input ("day07_input.txt" )
55
+
56
+ answers , values = process_input (input_lines )
57
+
58
+ # Part 1:
59
+ print ("Answer Part 1:" )
60
+ pos_operators = [op .add , op .mul ]
61
+ do_puzzle (answers , values , pos_operators )
62
+
63
+ # Part 2:
64
+ print ("Answer Part 2:" )
65
+ pos_operators = [op .add , op .mul , concatenate_operator ]
66
+ do_puzzle (answers , values , pos_operators )
0 commit comments