075 Singular integer right triangles -- v2.sf 938 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #!/usr/bin/ruby
  2. # Author: Trizen
  3. # Date: 21 March 2023
  4. # https://github.com/trizen
  5. # https://projecteuler.net/problem=75
  6. # Runtime: 55.256s
  7. func count_singular_integer_right_triangles(limit) {
  8. var triangle = Hash()
  9. var upto = limit.isqrt
  10. for n in (1 .. upto) {
  11. for m in (range(n+1, upto, 2)) {
  12. n.is_coprime(m) || next
  13. for (var k = 1; true; ++k) {
  14. var x = (k * (m*m - n*n))
  15. var y = (k * (2 * m * n))
  16. var z = (k * (m*m + n*n))
  17. var p = x+y+z
  18. break if (p > limit)
  19. triangle{p} := 0 ++
  20. }
  21. }
  22. }
  23. triangle.values.count_by { .is_one }
  24. }
  25. assert_eq(count_singular_integer_right_triangles(48), 6)
  26. assert_eq(count_singular_integer_right_triangles(120), 13)
  27. assert_eq(count_singular_integer_right_triangles(1200), 129)
  28. say count_singular_integer_right_triangles(1_500_000)