mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-26 05:10:32 +01:00
62 lines
1.4 KiB
Python
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])
|
|
)
|