1+
2+
3+ def _is_equal_part1 (target :int , nums :list [int ], prefix :int )-> bool :
4+ if (not nums ):
5+ return prefix == target
6+
7+ is_equal = False
8+
9+ # we can do `*` or `+` 2 operators
10+ prefix_mul = prefix * nums [0 ]
11+ is_equal = is_equal or _is_equal_part1 (target ,nums [1 :],prefix_mul )
12+
13+ prefix_add = prefix + nums [0 ]
14+ is_equal = is_equal or _is_equal_part1 (target ,nums [1 :],prefix_add )
15+
16+ return is_equal
17+
18+
19+ def solve_day7_part1 (matrix :list [str ])-> int :
20+ res = 0
21+ for line in matrix :
22+ expected_answer , given_input = line .split (":" )
23+ target = int (expected_answer )
24+ nums = [int (num ) for num in given_input .strip ().split (" " )]
25+ if _is_equal_part1 (target , nums [1 :],nums [0 ]):
26+ res += target
27+
28+ return res
29+
30+
31+
32+ def _is_equal_part2 (target :int , nums :list [int ], prefix :int )-> bool :
33+ if (not nums ):
34+ return prefix == target
35+
36+ is_equal = False
37+
38+ # we can do `*` or `+` or `||` 3 operators
39+ prefix_mul = prefix * nums [0 ]
40+ is_equal = is_equal or _is_equal_part2 (target ,nums [1 :],prefix_mul )
41+
42+ prefix_add = prefix + nums [0 ]
43+ is_equal = is_equal or _is_equal_part2 (target ,nums [1 :],prefix_add )
44+
45+ prefix_concat = int (str (prefix ) + str (nums [0 ]))
46+ is_equal = is_equal or _is_equal_part2 (target ,nums [1 :],prefix_concat )
47+
48+ return is_equal
49+
50+
51+ def solve_day7_part2 (matrix :list [str ])-> int :
52+ res = 0
53+ for line in matrix :
54+ expected_answer , given_input = line .split (":" )
55+ target = int (expected_answer )
56+ nums = [int (num ) for num in given_input .strip ().split (" " )]
57+ if _is_equal_part2 (target , nums [1 :],nums [0 ]):
58+ res += target
59+
60+ return res
0 commit comments