Implement 2024 day 7

This commit is contained in:
2024-12-07 10:35:58 +01:00
parent 0c7c54b5c9
commit c871a9ea24
3 changed files with 87 additions and 0 deletions

61
2024/src/aoc/days/day7.py Normal file
View File

@@ -0,0 +1,61 @@
from . import SeparateRunner
def parse_input(input: str) -> tuple[int, list[int]]:
result = []
for line in input.strip().split("\n"):
test, nums = line.split(": ")
result.append((int(test), list(map(int, nums.split(" ")))))
return result
def is_possible(target: int, nums: list[int], cur: int) -> bool:
if cur == target and not nums:
return True
if cur > target or not nums:
return False
head = nums[0]
remainder = nums[1:]
return is_possible(target, remainder, cur + head) or is_possible(
target, remainder, cur * head
)
def is_possible2(target: int, nums: list[int], cur: int) -> bool:
if cur == target and not nums:
return True
if cur > target or not nums:
return False
head = nums[0]
remainder = nums[1:]
return (
is_possible2(target, remainder, cur + head)
or is_possible2(target, remainder, cur * head)
or is_possible2(target, remainder, int(f"{cur}{head}"))
)
class DayRunner(SeparateRunner):
@classmethod
def part1(cls, input: str) -> int:
lines = parse_input(input)
return sum(
target for target, nums in lines if is_possible(target, nums[1:], nums[0])
)
@classmethod
def part2(cls, input: str) -> int:
lines = parse_input(input)
return sum(
target for target, nums in lines if is_possible2(target, nums[1:], nums[0])
)