質問

('1' * N) !~ /^1?$|^(11+?)\1+$/

ネット上で、Nが素数かどうかを決定するN> = 0で機能するこのRubyコードを見つけました。私が言うことができることから、それは正規表現で遊ぶように見えますが、それがどのように機能するのか分かりません。誰かがそれがどのように機能するか教えてもらえますか?

役に立ちましたか?

解決

このコードの詳細な説明はこちらにあります: http:// www.noulakaz.net/weblog/2007/03/18/a-regular-expression-to-check-for-prime-numbers/

他のヒント

これはおそらくかなり話題から外れていますが、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ケースをチェックします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top