Skip to content

Commit d49fc8e

Browse files
committed
Do day 7 RTL
That does indeed cut down branching significantly
1 parent cb7aedc commit d49fc8e

File tree

1 file changed

+25
-25
lines changed

1 file changed

+25
-25
lines changed

2024/src/aoc/days/day7.py

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,35 +11,39 @@ def parse_input(input: str) -> tuple[int, list[int]]:
1111
return result
1212

1313

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:
1918
return False
2019

21-
head = nums[0]
22-
remainder = nums[1:]
20+
tail = nums[-1]
21+
remainder = nums[:-1]
2322

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)
2625
)
2726

2827

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:
3432
return False
3533

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)
3839

3940
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+
)
4347
)
4448

4549

@@ -48,14 +52,10 @@ class DayRunner(SeparateRunner):
4852
def part1(cls, input: str) -> int:
4953
lines = parse_input(input)
5054

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))
5456

5557
@classmethod
5658
def part2(cls, input: str) -> int:
5759
lines = parse_input(input)
5860

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

Comments
 (0)