mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 21:00:31 +01:00
Implement 2024 day 7
This commit is contained in:
61
2024/src/aoc/days/day7.py
Normal file
61
2024/src/aoc/days/day7.py
Normal 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])
|
||||
)
|
||||
Reference in New Issue
Block a user