from tools.aoc import AOCDay from typing import Any class Day(AOCDay): inputs = [ [ (588, "input15_test"), (567, "input15") ], [ (309, "input15_test"), (323, "input15") ] ] factor_a = 16807 factor_b = 48271 def get_generator_start_values(self) -> (int, int): return map(int, map(lambda x: x.split(" ")[-1], self.getInput())) def part1(self) -> Any: a, b = self.get_generator_start_values() count = 0 for _ in range(40_000_000): a, b = a * self.factor_a % 2147483647, b * self.factor_b % 2147483647 if a & 0x0000FFFF == b & 0x0000FFFF: count += 1 return count def part2(self) -> Any: a, b = self.get_generator_start_values() count = 0 for _ in range(5_000_000): a = a * self.factor_a % 2147483647 while a % 4 != 0: a = a * self.factor_a % 2147483647 b = b * self.factor_b % 2147483647 while b % 8 != 0: b = b * self.factor_b % 2147483647 if a & 0x0000FFFF == b & 0x0000FFFF: count += 1 return count if __name__ == '__main__': day = Day(2017, 15) day.run(verbose=True)