digit-segmentation_square_root_representation.sf 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #!/usr/bin/ruby
  2. # A perfect square N has a splitting representation (S) if it's possible to segment
  3. # the decimal representation of N into a list of integers L, such that sum(L) = sqrt(n).
  4. # See also:
  5. # https://oeis.org/A104113
  6. # https://projecteuler.net/problem=719
  7. func S_representation(n) {
  8. var v = n.isqrt
  9. var D = n.digits
  10. D.ordered_partitions({|*t|
  11. if (t.sum{.digits2num} == v) {
  12. return t
  13. }
  14. })
  15. return false
  16. }
  17. for n in (2 .. 1000 -> map { _*_ }) {
  18. var arr = S_representation(n) || next
  19. say ("sqrt(#{n}) = ", arr.flip.map{.digits2num}.grep.join(' + '))
  20. }
  21. __END__
  22. sqrt(81) = 8 + 1
  23. sqrt(100) = 10
  24. sqrt(1296) = 1 + 29 + 6
  25. sqrt(2025) = 20 + 25
  26. sqrt(3025) = 30 + 25
  27. sqrt(6724) = 6 + 72 + 4
  28. sqrt(8281) = 8 + 2 + 81
  29. sqrt(9801) = 98 + 1
  30. sqrt(10000) = 100
  31. sqrt(55225) = 5 + 5 + 225
  32. sqrt(88209) = 88 + 209
  33. sqrt(136161) = 1 + 361 + 6 + 1
  34. sqrt(136900) = 1 + 369
  35. sqrt(143641) = 14 + 364 + 1
  36. sqrt(171396) = 17 + 1 + 396
  37. sqrt(431649) = 4 + 3 + 1 + 649
  38. sqrt(455625) = 45 + 5 + 625
  39. sqrt(494209) = 494 + 209
  40. sqrt(571536) = 5 + 715 + 36
  41. sqrt(627264) = 62 + 726 + 4
  42. sqrt(826281) = 826 + 2 + 81
  43. sqrt(842724) = 842 + 72 + 4
  44. sqrt(893025) = 8 + 930 + 2 + 5
  45. sqrt(929296) = 929 + 29 + 6
  46. sqrt(980100) = 980 + 10
  47. sqrt(982081) = 982 + 8 + 1
  48. sqrt(998001) = 998 + 1
  49. sqrt(1000000) = 1000