from tools.aoc import AOCDay from typing import Any import re class Day(AOCDay): inputs = [ [ (322, "input3_test"), # example contained twice due to the real input having multiple lines (196826776, "input3"), ], [ (96, "input3_test2"), # example contained twice due to the real input having multiple lines (106780429, "input3"), ], ] def get_matches(self, regex: re.Pattern) -> tuple: for line in self.getInput(): for match in regex.findall(line): yield match def part1(self) -> Any: return sum(int(match[0]) * int(match[1]) for match in self.get_matches(re.compile(r"mul\((\d+),(\d+)\)"))) def part2(self) -> Any: ans = 0 do = True for match in self.get_matches(re.compile(r"((do)\(\)|(don't)\(\)|mul\((\d+),(\d+)\))")): if match[1] == "do": do = True elif match[2] == "don't": do = False elif do: ans += int(match[3]) * int(match[4]) return ans if __name__ == "__main__": day = Day(2024, 3) day.run(verbose=True)