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])
|
||||||
|
)
|
||||||
9
2024/tests/samples/07.txt
Normal file
9
2024/tests/samples/07.txt
Normal 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
17
2024/tests/test_day07.py
Normal 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
|
||||||
Reference in New Issue
Block a user