85 lines
2.0 KiB
Plaintext
85 lines
2.0 KiB
Plaintext
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"
|
|
}
|