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

View File

@@ -0,0 +1,9 @@
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

17
2024/tests/test_day07.py Normal file
View File

@@ -0,0 +1,17 @@
import os
from aoc.days.day7 import DayRunner
def get_data() -> str:
sample = os.path.dirname(__file__) + "/samples/07.txt"
with open(sample, mode="rt", encoding="utf-8") as f:
return f.read()
def test_sample_part1() -> None:
assert DayRunner.part1(get_data()) == 3749
def test_sample_part2() -> None:
assert DayRunner.part2(get_data()) == 11387