Skip to content

Commit 412cb84

Browse files
Advent of Code 2024 - Day 7 : Python version (#45)
1 parent 627cfd8 commit 412cb84

File tree

2 files changed

+87
-0
lines changed

2 files changed

+87
-0
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
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
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import unittest
2+
3+
from day7 import solve_day7_part1, solve_day7_part2
4+
5+
6+
input7 = [
7+
"190: 10 19",
8+
"3267: 81 40 27",
9+
"83: 17 5",
10+
"156: 15 6",
11+
"7290: 6 8 6 15",
12+
"161011: 16 10 13",
13+
"192: 17 8 14",
14+
"21037: 9 7 18 13",
15+
"292: 11 6 16 20",
16+
]
17+
18+
class TestDay7(unittest.TestCase):
19+
20+
def test_part1(self):
21+
self.assertEqual(solve_day7_part1(input7), 3749)
22+
23+
def test_part2(self):
24+
self.assertEqual(solve_day7_part2(input7), 11387)
25+
26+
if __name__ == "__main__":
27+
unittest.main()

0 commit comments

Comments
 (0)