aoc2024/day07.py
2024-12-07 06:51:50 +01:00

53 lines
1.5 KiB
Python

from tools.aoc import AOCDay
from tools.math import concat
from typing import Any
def calc(start: int, numbers: list[int], result: int, part2: bool = False) -> bool:
if len(numbers) == 1:
return (
start + numbers[0] == result
or start * numbers[0] == result
or (part2 and concat(start, numbers[0]) == result)
)
else:
return (
calc(start + numbers[0], numbers[1:], result, part2)
or calc(start * numbers[0], numbers[1:], result, part2)
or (part2 and calc(concat(start, numbers[0]), numbers[1:], result, part2))
)
class Day(AOCDay):
inputs = [
[
(3749, "input7_test"),
(20281182715321, "input7"),
],
[
(11387, "input7_test"),
(159490400628354, "input7"),
],
]
def parse_input(self) -> dict[int, list[int]]:
calibrations = {}
for line in self.getInput():
result, numbers = line.split(": ")
calibrations[int(result)] = list(map(int, numbers.split()))
return calibrations
def part1(self) -> Any:
return sum(result for result, numbers in self.parse_input().items() if calc(numbers[0], numbers[1:], result))
def part2(self) -> Any:
return sum(
result for result, numbers in self.parse_input().items() if calc(numbers[0], numbers[1:], result, True)
)
if __name__ == "__main__":
day = Day(2024, 7)
day.run(verbose=True)