@@ -11,35 +11,39 @@ def parse_input(input: str) -> tuple[int, list[int]]:
11
11
return result
12
12
13
13
14
- def is_possible (target : int , nums : list [int ], cur : int ) -> bool :
15
- if cur == target and not nums :
16
- return True
17
-
18
- if cur > target or not nums :
14
+ def is_possible (target : int , nums : list [int ]) -> bool :
15
+ if target == 0 :
16
+ return not nums
17
+ if not nums or target < 0 :
19
18
return False
20
19
21
- head = nums [0 ]
22
- remainder = nums [1 : ]
20
+ tail = nums [- 1 ]
21
+ remainder = nums [: - 1 ]
23
22
24
- return is_possible (target , remainder , cur + head ) or is_possible (
25
- target , remainder , cur * head
23
+ return is_possible (target - tail , remainder ) or (
24
+ target % tail == 0 and is_possible ( target // tail , remainder )
26
25
)
27
26
28
27
29
- def is_possible2 (target : int , nums : list [int ], cur : int ) -> bool :
30
- if cur == target and not nums :
31
- return True
32
-
33
- if cur > target or not nums :
28
+ def is_possible2 (target : int , nums : list [int ]) -> bool :
29
+ if target == 0 :
30
+ return not nums
31
+ if not nums or target < 0 :
34
32
return False
35
33
36
- head = nums [0 ]
37
- remainder = nums [1 :]
34
+ tail = nums [- 1 ]
35
+ remainder = nums [:- 1 ]
36
+
37
+ target_str = str (target )
38
+ tail_str = str (tail )
38
39
39
40
return (
40
- is_possible2 (target , remainder , cur + head )
41
- or is_possible2 (target , remainder , cur * head )
42
- or is_possible2 (target , remainder , int (f"{ cur } { head } " ))
41
+ is_possible2 (target - tail , remainder )
42
+ or (target % tail == 0 and is_possible2 (target // tail , remainder ))
43
+ or (
44
+ target_str .endswith (tail_str )
45
+ and is_possible2 (int (target_str [: - len (str (tail_str ))]), remainder )
46
+ )
43
47
)
44
48
45
49
@@ -48,14 +52,10 @@ class DayRunner(SeparateRunner):
48
52
def part1 (cls , input : str ) -> int :
49
53
lines = parse_input (input )
50
54
51
- return sum (
52
- target for target , nums in lines if is_possible (target , nums [1 :], nums [0 ])
53
- )
55
+ return sum (target for target , nums in lines if is_possible (target , nums ))
54
56
55
57
@classmethod
56
58
def part2 (cls , input : str ) -> int :
57
59
lines = parse_input (input )
58
60
59
- return sum (
60
- target for target , nums in lines if is_possible2 (target , nums [1 :], nums [0 ])
61
- )
61
+ return sum (target for target , nums in lines if is_possible2 (target , nums ))
0 commit comments