質問
('1' * N) !~ /^1?$|^(11+?)\1+$/
ネット上で、Nが素数かどうかを決定するN> = 0で機能するこのRubyコードを見つけました。私が言うことができることから、それは正規表現で遊ぶように見えますが、それがどのように機能するのか分かりません。誰かがそれがどのように機能するか教えてもらえますか?
解決
他のヒント
これはおそらくかなり話題から外れていますが、Ruby 1.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
最大公約数(gcd):
/^(1+)\1*=\1+$/.match('1' * x + '=' + '1' * y)[1].length
これとis_primeのどちらもほぼ同じように機能します。あきらめる前にすべての組み合わせを試します。
これは、最初の数値を偶数部分に分割し、2番目の数値をそれらの1つ以上の部分と一致させようとします。一致するものが見つかった場合、選択した部分の長さを返します。
かなり良い説明のある別のブログ:有名Perlワンライナーの説明(パートIII)
1の文字列の長さが合成の場合、文字列は111111->のような複数の同一の部分文字列に分解できます。 11 11 11
たとえば、1111111111には10個の1があり、(11){5}または(11111){2}に一致します。{2}は2回繰り返されることを意味します。 111111111、9個の1があり、(111){3}と一致します。
1のカウントと{}の数を一般化することにより、正規表現は
/(1 {2、}){2、} /
。
ただし、1 {2、}は11+と書くこともでき、(...){2、}は後方参照を使用して(...)\ 1+と書き直すことができます。
最初の代替の ^ 1?$
部分は、0ケースと1ケースをチェックします。
所属していません StackOverflow