何の気無しにやってみた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の例が分かりやすかったです。なるほど遅延評価か。
面白いなぁ。