Ruby - 遅延評価を使用して最初の N 個の回文素数を見つける

概要

私のコードは正しいと思いますが、N = 200に間に合うように配列を返しません。エラーは「タイムアウトのため終了しました」です。 このコードのパフォーマンスを向上させるにはどうすればよいでしょうか?

def is_palindrome? (n)
   n.to_s==n.to_s.reverse
end

def is_prime? (n)
  return false if n< 2
  (2..Math.sqrt(n)).none? {|f| n % f == 0}
end

prime_palindrome =-> (n) do
   1.upto(Float::INFINITY).lazy.select { |n| is_prime?(n) && is_palindrome(n) }.first(n)
end


n = gets.to_i 
p prime_palindrome.call(n)

解決策

Ruby はこれをより速く行う方法を知っています。

require 'prime'

Prime.each.lazy.
    select { |p| p.to_s.then { |s| s == s.reverse } }.
    take(200).to_a