Files
adventofcode/2024/src/aoc/days/day7.py
2024-12-07 10:35:58 +01:00

62 lines
1.4 KiB
Python

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