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)