Skip to content

Commit

Permalink
Implement 2024 day 7
Browse files Browse the repository at this point in the history
  • Loading branch information
bertptrs committed Dec 7, 2024
1 parent 0c7c54b commit c871a9e
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 0 deletions.
61 changes: 61 additions & 0 deletions 2024/src/aoc/days/day7.py
Original file line number Diff line number Diff line change
@@ -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 changes: 9 additions & 0 deletions 2024/tests/samples/07.txt
Original file line number Diff line number Diff line change
@@ -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 changes: 17 additions & 0 deletions 2024/tests/test_day07.py
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit c871a9e

Please sign in to comment.