816 Shortest distance among points.sf 926 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #!/usr/bin/ruby
  2. # Author: Trizen
  3. # Date: 26 November 2023
  4. # https://github.com/trizen
  5. # Shortest Distance Among Points
  6. # https://projecteuler.net/problem=816
  7. # Runtime: 4 minutes, 19 seconds
  8. func rng(n) is cached {
  9. n == 0 && return 290797
  10. powmod(__FUNC__(n-1), 2, 50515093)
  11. }
  12. func d(k) {
  13. var P = k.of {|n|
  14. [rng(2*n), rng(2*n + 1)]
  15. }
  16. var C1 = P.sort_by{ .head }
  17. var C2 = P.sort_by{ .tail }
  18. var min_dist = Inf
  19. C1.each_cons(2, {|a,b|
  20. var dist = hypot(a[0] - b[0], a[1] - b[1])
  21. if (dist < min_dist) {
  22. min_dist = dist
  23. }
  24. })
  25. C2.each_cons(2, {|a,b|
  26. var dist = hypot(a[0] - b[0], a[1] - b[1])
  27. if (dist < min_dist) {
  28. min_dist = dist
  29. }
  30. })
  31. return min_dist.round(-9)
  32. }
  33. assert_eq(d(14), 546446.466846479f)
  34. assert_eq(d(1000), 14759.650571745f)
  35. assert_eq(d(2000), 16462.444107726f)
  36. say d(2000000)