Solve e816 because I have to get easy ones for my Euler goal.

main
felixm 2023-09-28 23:23:55 +02:00
parent 880385a451
commit 743966c7b8
2 changed files with 49 additions and 7 deletions

39
python/e816.py Normal file
View File

@ -0,0 +1,39 @@
from math import sqrt
def distance(p1, p2) -> float:
return (p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2
def points(k: int):
s = 290797
mod = 50515093
# s = 5
# mod = 23
points = []
for _ in range(k):
sn = (s ** 2) % mod
p = (s, sn)
points.append(p)
s = (sn ** 2) % mod
return points
def euler_816():
ps = sorted(points(2000000), key=lambda p: p[0])
d_min = float("inf")
sweep_dist = 5 # heuristic
for i in range(len(ps)):
for j in range(i, min(i + sweep_dist, len(ps))):
if i == j:
continue
d = distance(ps[i], ps[j])
if d < d_min:
d_min = d
return round(sqrt(d_min), 9)
if __name__ == "__main__":
solution = euler_816()
print("e816.py: " + str(solution))
assert(solution == 20.880613018)

View File

@ -1,5 +1,4 @@
FROM = 100
TILL = 100
import sys
TEMPLATE = """
def euler_XXX():
@ -14,13 +13,17 @@ if __name__ == "__main__":
"""
for i in range(FROM, TILL + 1):
if i < 100:
e = "0" + str(i)
else:
e = str(i)
def main():
try:
e = sys.argv[1]
except IndexError:
print("Provide Euler problem number for which to create template.")
return
filename = "e" + e + ".py"
with open(filename, "w") as f:
s = TEMPLATE.replace("XXX", e)
f.write(s)
if __name__ == "__main__":
main()