Prime Palindrome続き

何の気無しにやってみたcodeevalですが
他にもやってみた方(id:keyesberry)がいて、そちらのソースと見比べてみたところ
ああなるほど、と思ったのでメモ。
勉強になるなぁ。


お題は、「回文の素数で1000以下で最大のものを出力」。
Prime Palindrome - うんたらかんたら日記

まずは

素数かどうかを判定するprime?メソッド。

私が最初に書いたソース
def prime? num
  half_num = num / 2
  (2..half_num).each do |n|
    return false if num % n == 0
  end
  true
end
keyesberryさん
def prime?(n)
  return false if (2..n/2).any? { |i| (n%i).zero? }
  true
end
参考になった点

・不要な一変数がなくなってる
・any? を使ってすっきり
・zero? cool(使ったことなかったわ)
・変数わかりやすい(n,i、全体的に統一されている)

次は回文

これは、ぼやっとしてました。
回文だから、前後入れ替えて比較するだけでした。

オレオレ
def halv str
  half_size = str.size / 2
  first = str[0, half_size]
  last  = str[-half_size, half_size]
  [first, last]
end

def palindrome? num
  first, last = halv(num.to_s)
  first == last.reverse
end
keyesberryさん
def palindrome?(n)
  "#{n}" == "#{n}".reverse
end

んでEnumerator.new

オレオレ
1000.downto(2) do |n|
  if (prime?(n) and palindrome?(n))
    puts n
    break
  end
end
keyesberrさん
def downfrom_by(n)
  Enumerator.new do |y|
    loop {
      y << n if yield(n)
      n < 2 ? break : n -= 1
    }
  end
end

puts downfrom_by(1000) { |n| prime?(n) and palindrome?(n) }.first
Enumerator.new って何ぞ?

singleton method Enumerator.new


何となく挙動は分かったが、使いどころとかよくわかんなかったので
ググってみると、下記記事が見つかりました。
enumerabler.rb: Enumerable の遅延評価版メソッドライブラリ - まめめも


takeの例が分かりやすかったです。なるほど遅延評価か。
面白いなぁ。