60 lines
966 B
Python
60 lines
966 B
Python
from lib import str_to_int
|
|
|
|
|
|
def part_1(data):
|
|
fa = 16807
|
|
fb = 48271
|
|
m = 2147483647
|
|
|
|
xs = []
|
|
for line in data.splitlines():
|
|
xs.append(str_to_int(line))
|
|
a, b = xs
|
|
|
|
c = 0
|
|
for _ in range(40_000_000):
|
|
a = (a * fa) % m
|
|
b = (b * fb) % m
|
|
if (a & 0xffff) == (b & 0xffff):
|
|
c += 1
|
|
print(c)
|
|
|
|
|
|
def gen(a, f, m, d):
|
|
while True:
|
|
a = (a * f) % m
|
|
if a % d == 0:
|
|
yield a
|
|
|
|
|
|
def part_2(data):
|
|
fa = 16807
|
|
fb = 48271
|
|
m = 2147483647
|
|
|
|
xs = []
|
|
for line in data.splitlines():
|
|
xs.append(str_to_int(line))
|
|
a, b = xs
|
|
|
|
xs = gen(a, fa, m, 4)
|
|
ys = gen(b, fb, m, 8)
|
|
|
|
c = 0
|
|
for _ in range(5_000_000):
|
|
a = next(xs)
|
|
b = next(ys)
|
|
if (a & 0xffff) == (b & 0xffff):
|
|
c += 1
|
|
print(c)
|
|
|
|
|
|
def main():
|
|
data = open(0).read().strip()
|
|
part_1(data)
|
|
part_2(data)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|