cyclops_numbers.sf 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 28 July 2021
  4. # https://github.com/trizen
  5. # Generate cyclops numbers.
  6. # A cyclops number is a number with an odd number of digits that has a zero in the center, but nowhere else.
  7. # They are named so in tribute to the one eyed giants Cyclops from Greek mythology.
  8. # See also:
  9. # https://rosettacode.org/wiki/Cyclops_numbers
  10. func cyclops_numbers(base = 10) {
  11. Enumerator({|callback|
  12. var digits = @(1 .. base-1)
  13. for k in (0 .. Inf `by` 2) {
  14. digits.variations_with_repetition(k, {|*a|
  15. a = (a.first(a.len>>1) + [0] + a.last(a.len>>1))
  16. callback(a.flip.digits2num(base))
  17. })
  18. }
  19. })
  20. }
  21. func palindromic_cyclops_numbers(base = 10) {
  22. Enumerator({|callback|
  23. var digits = @(1 .. base-1)
  24. for k in (0..Inf) {
  25. digits.variations_with_repetition(k, {|*a|
  26. a = (a + [0] + a.flip)
  27. callback(a.flip.digits2num(base))
  28. })
  29. }
  30. })
  31. }
  32. func prime_cyclops(base = 10) {
  33. var iter = cyclops_numbers(base)
  34. Enumerator({|callback|
  35. iter.each {|n|
  36. callback(n) if n.is_prime
  37. }
  38. })
  39. }
  40. func blind_prime_cyclops(base = 10) {
  41. var iter = prime_cyclops(base)
  42. Enumerator({|callback|
  43. iter.each {|n|
  44. var k = (n.len(base)-1)>>1
  45. var r = ipow(base, k)
  46. if (r*idiv(n, r*base) + n%r -> is_prime) {
  47. callback(n)
  48. }
  49. }
  50. })
  51. }
  52. func palindromic_prime_cyclops(base = 10) {
  53. var iter = palindromic_cyclops_numbers(base)
  54. Enumerator({|callback|
  55. iter.each {|n|
  56. callback(n) if n.is_prime
  57. }
  58. })
  59. }
  60. for text,f in ([
  61. ['', cyclops_numbers],
  62. ['prime', prime_cyclops],
  63. ['blind prime', blind_prime_cyclops],
  64. ['palindromic prime', palindromic_prime_cyclops],
  65. ]) {
  66. with (50) {|k|
  67. say "\nFirst #{k} #{text} cyclops numbers:"
  68. f().first(k).each_slice(10, {|*a|
  69. a.map { '%7s' % _ }.join(' ').say
  70. })
  71. }
  72. }
  73. __END__
  74. First 50 cyclops numbers:
  75. 0 101 102 103 104 105 106 107 108 109
  76. 201 202 203 204 205 206 207 208 209 301
  77. 302 303 304 305 306 307 308 309 401 402
  78. 403 404 405 406 407 408 409 501 502 503
  79. 504 505 506 507 508 509 601 602 603 604
  80. First 50 prime cyclops numbers:
  81. 101 103 107 109 307 401 409 503 509 601
  82. 607 701 709 809 907 11027 11047 11057 11059 11069
  83. 11071 11083 11087 11093 12011 12037 12041 12043 12049 12071
  84. 12073 12097 13033 13037 13043 13049 13063 13093 13099 14011
  85. 14029 14033 14051 14057 14071 14081 14083 14087 15013 15017
  86. First 50 blind prime cyclops numbers:
  87. 101 103 107 109 307 401 503 509 601 607
  88. 701 709 809 907 11071 11087 11093 12037 12049 12097
  89. 13099 14029 14033 14051 14071 14081 14083 14087 15031 15053
  90. 15083 16057 16063 16067 16069 16097 17021 17033 17041 17047
  91. 17053 17077 18047 18061 18077 18089 19013 19031 19051 19073
  92. First 50 palindromic prime cyclops numbers:
  93. 101 16061 31013 35053 38083 73037 74047 91019 94049 1120211
  94. 1150511 1160611 1180811 1190911 1250521 1280821 1360631 1390931 1490941 1520251
  95. 1550551 1580851 1630361 1640461 1660661 1670761 1730371 1820281 1880881 1930391
  96. 1970791 3140413 3160613 3260623 3310133 3380833 3460643 3470743 3590953 3670763
  97. 3680863 3970793 7190917 7250527 7310137 7540457 7630367 7690967 7750577 7820287