func cyclops_numbers(base = 10) { Enumerator({|callback| var digits = @(1 .. base-1) for k in (0 .. Inf `by` 2) { digits.variations_with_repetition(k, {|*a| a = (a.first(a.len>>1) + [0] + a.last(a.len>>1)) callback(a.flip.digits2num(base)) }) } }) } func palindromic_cyclops_numbers(base = 10) { Enumerator({|callback| var digits = @(1 .. base-1) for k in (0..Inf) { digits.variations_with_repetition(k, {|*a| a = (a + [0] + a.flip) callback(a.flip.digits2num(base)) }) } }) } func prime_cyclops(base = 10) { var iter = cyclops_numbers(base) Enumerator({|callback| iter.each {|n| callback(n) if n.is_prime } }) } func blind_prime_cyclops(base = 10) { var iter = prime_cyclops(base) Enumerator({|callback| iter.each {|n| var k = (n.len(base)-1)>>1 var r = ipow(base, k) if (r*idiv(n, r*base) + n%r -> is_prime) { callback(n) } } }) } func palindromic_prime_cyclops(base = 10) { var iter = palindromic_cyclops_numbers(base) Enumerator({|callback| iter.each {|n| callback(n) if n.is_prime } }) } for text,f in ([ ['', cyclops_numbers], ['prime', prime_cyclops], ['blind prime', blind_prime_cyclops], ['palindromic prime', palindromic_prime_cyclops], ]) { with (50) {|k| say "First #{k} #{text} cyclops numbers:" f().first(k).each_slice(10, {|*a| a.map { '%7s' % _ }.join(' ').say }) } var min = 10_000_000 var iter = f() var index = 0 var arr = Enumerator({|callback| iter.each {|n| callback([index, n]) if (n > min) ++index } }).first(1)[0] say "\nFirst #{text} term > #{min.commify}: #{arr[1].commify} at (zero based) index: #{arr[0].commify}\n" }