#!/usr/bin/ruby
#
## https://rosettacode.org/wiki/Emirp_primes
#
func forprimes(a, b, callback) {
for (var p = a.dec.next_prime; p <= b; p.next_prime!) {
callback(p)
}
}
func is_emirp(p) {
var str = Str(p)
var rev = str.reverse
(str != rev) && is_prime(Num(rev))
}
func emirp_list(count) {
var i = 13
var inc = (100 + 10*count)
var n = []
while (n.len < count) {
forprimes(i, i+inc - 1, {|p|
is_emirp(p) && (n << p)
})
(i, inc) = (i+inc, int(inc * 1.03) + 1000)
}
n.splice(count)
return n
}
var emirps = emirp_list(20)
say ("First 20: ", emirps.join(' '))
say ("Between 7700 and 8000: ", gather {
forprimes(7700, 8000, {|p| is_emirp(p) && take(p) })
}.join(' '))
assert_eq(emirps, [13, 17, 31, 37, 71, 73, 79, 97, 107, 113, 149, 157, 167, 179, 199, 311, 337, 347, 359, 389])