generated from public/aoc_template
53 lines
1.6 KiB
Python
53 lines
1.6 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"),
|
|
(1298103531759, "input7_dennis"),
|
|
(20281182715321, "input7"),
|
|
],
|
|
[
|
|
(11387, "input7_test"),
|
|
(140575048428831, "input7_dennis"),
|
|
(159490400628354, "input7"),
|
|
],
|
|
]
|
|
|
|
def parse_input(self) -> list[tuple[int, list[int]]]:
|
|
calibrations = []
|
|
for line in self.getInput():
|
|
result, numbers = line.split(": ")
|
|
calibrations.append((int(result), list(map(int, numbers.split()))))
|
|
|
|
return calibrations
|
|
|
|
def part1(self) -> Any:
|
|
return sum(result for result, numbers in self.parse_input() if calc(numbers[0], numbers[1:], result))
|
|
|
|
def part2(self) -> Any:
|
|
return sum(result for result, numbers in self.parse_input() if calc(numbers[0], numbers[1:], result, True))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
day = Day(2024, 7)
|
|
day.run(verbose=True)
|