('1' * N) !~ /^1?$|^(11+?)\1+$/
ネット上で、N >= 0 で動作し、N が素数かどうかを判断するこの Ruby コードを見つけました。私が知る限り、正規表現で遊んでいるように見えますが、どのように機能するのかわかりません。誰かがそれがどのように機能するか教えてもらえますか?
このコードの長い説明は、 http ://www.noulakaz.net/weblog/2007/03/18/a-regular-expression-to-check-for-prime-numbers/ にあります。
これはおそらくかなりトピックから外れていますが、Ruby1.9では次のことができます。
require 'mathn'
38749711234868463.prime?
=> false
require 'prime'
Prime.prime?(4)
# => false
Prime.prime?(5)
# => true
または:
require 'prime'
Prime.instance.prime?(4)
# => false
Prime.instance.prime?(5)
# => true
これまでに使用した中で最も優れた正規表現は何ですか?も参照してください。(そして、はい、この正規表現が最初に Abigail によって書かれたことを確認できます。私は彼女がそれがどのように機能するかを説明しているのを聞いたことさえあります:)
かなり良い説明のあるさらに別のブログ: Famous Perl One-Liners Explained (part III)
1 の文字列の長さが合成の場合、文字列は 111111 -> 11 11 11 のように、複数の同一の部分文字列に分解できます。
たとえば、1111111111 には 1 が 10 個あり、(11){5} または (11111){2} と一致します。ここで、{2} は 2 回繰り返されることを意味します。111111111、1 が 9 個あり、(111){3} と一致します。
1 の数と {} の数を一般化すると、正規表現は になり
/(1{2,}){2,}/
ます。ただし、1{2,} は 11+ と書くこともでき、(...){2,} は後方参照を使用して (...)\1+ と書き直すこともできます。
最初の交互の^1?$
部分は、0 と 1 のケースをチェックします。
最大公約数 (gcd):
/^(1+)\1*=\1+$/.match('1' * x + '=' + '1' * y)[1].length
これと is_prime はどちらもほぼ同じように機能します。あきらめる前にすべての組み合わせを試します。
これは、最初の数字を偶数部分に分割し、2 番目の数字をそれらの部分の 1 つ以上と一致させようとします。一致するものが見つかった場合は、選択した部分の長さを返します。