56 lines
1.3 KiB
Python
56 lines
1.3 KiB
Python
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)
|