Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions advent_of_code/2024(python)/day7.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@


def _is_equal_part1(target:int, nums:list[int], prefix:int)->bool:
if (not nums):
return prefix == target

is_equal = False

# we can do `*` or `+` 2 operators
prefix_mul = prefix*nums[0]
is_equal = is_equal or _is_equal_part1(target,nums[1:],prefix_mul)

prefix_add = prefix+nums[0]
is_equal = is_equal or _is_equal_part1(target,nums[1:],prefix_add)

return is_equal


def solve_day7_part1(matrix:list[str])->int:
res = 0
for line in matrix:
expected_answer, given_input = line.split(":")
target = int(expected_answer)
nums = [int(num) for num in given_input.strip().split(" ")]
if _is_equal_part1(target, nums[1:],nums[0]):
res += target

return res



def _is_equal_part2(target:int, nums:list[int], prefix:int)->bool:
if (not nums):
return prefix == target

is_equal = False

# we can do `*` or `+` or `||` 3 operators
prefix_mul = prefix*nums[0]
is_equal = is_equal or _is_equal_part2(target,nums[1:],prefix_mul)

prefix_add = prefix+nums[0]
is_equal = is_equal or _is_equal_part2(target,nums[1:],prefix_add)

prefix_concat = int(str(prefix) + str(nums[0]))
is_equal = is_equal or _is_equal_part2(target,nums[1:],prefix_concat)

return is_equal


def solve_day7_part2(matrix:list[str])->int:
res = 0
for line in matrix:
expected_answer, given_input = line.split(":")
target = int(expected_answer)
nums = [int(num) for num in given_input.strip().split(" ")]
if _is_equal_part2(target, nums[1:],nums[0]):
res += target

return res
27 changes: 27 additions & 0 deletions advent_of_code/2024(python)/test_day7.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import unittest

from day7 import solve_day7_part1, solve_day7_part2


input7 = [
"190: 10 19",
"3267: 81 40 27",
"83: 17 5",
"156: 15 6",
"7290: 6 8 6 15",
"161011: 16 10 13",
"192: 17 8 14",
"21037: 9 7 18 13",
"292: 11 6 16 20",
]

class TestDay7(unittest.TestCase):

def test_part1(self):
self.assertEqual(solve_day7_part1(input7), 3749)

def test_part2(self):
self.assertEqual(solve_day7_part2(input7), 11387)

if __name__ == "__main__":
unittest.main()
Loading