今まで、cametan_42さんのブログで勉強してきて、今朝の散歩で思いついたのが、素数ネタです。取り敢えず4桁ということで、右から見ても、左から見ても、同じ数値。3桁なら101ですよね。直ぐは分かりません。9000番台であることは間違いないですが。cametan_42さんのブログに回文の書き込みもありますが、Rubyで書いてみようかと思います。
素数のジェネレータに対して、フィルタを作るということですね。
ちょっと驚きですが、929が10000以下で、右から読んでも、左から読んでも同じというのは929が最後らしい。上のスクリプトではそうでした。予想では9000番台にあるだろうと思ったんですが、無いみたいです。
それとこれはあくまで、素数のジェネレータですよね。これを改造して、回文の素数のジェネレータにするにはどうしたら良いんでしょうか?クラスの継承を使うのか?クラスのクラス、クラスのネスティング?有るのか?謎です。
追記1)
SosuCheck()をclass Primesに入れてみました。呼ぶ方では、primes.SosuCheck(x)となりました。未だ、回文素数ジェネレータに成ってません。
lazy,take,forceが三位一体ですかね。
そうですね。Rubyにあるライブラリです。
これでだいぶ労力が低減出来る。
PythonはBattery IncludedですがRubyもなかなか、ですねぇ。
> .forceはどんな働きですか?
遅延評価のオブジェクトを「実体化」させる為の働きをします。
こっちのブログでLispの話書いてましたが、そのLisp族のSchemeから借りてきてる機能ですね。さすがRubyの作者、Matz氏はLisperです。
Schemeには基本的な遅延評価関数が二つしかなく、それらはdelayとforceと呼ばれています。
delayは与えられた式の評価を止めます。
forceは評価が止まった式(プロミスと言います)の評価を始めさせます。
Rubyではlazyと言うメソッドが、大まかに言うとdelayで、forceがそのままforceですね。
require 'prime'とありますが、システムが用意してくれてるんですか?素数を用意してるのでなく、i.prime?で素数かそうでないか?判断するツールを用意している、そんな感じですね。.forceはどんな働きですか?
将棋か碁で、下手の考え休むに似たり、と正しくそれです。休みも必要ですよね。
require 'prime'
primes = (2..Float::INFINITY).lazy.select do |i|
i.prime?
end
def primedrome(p)
p.select do |i|
s = i.to_s
s == s.reverse
end
end
puts(primedrome(primes).take_while {|x| x < 10000}.force)