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

ネット上で、N >= 0 で動作し、N が素数かどうかを判断するこの Ruby コードを見つけました。私が知る限り、正規表現で遊んでいるように見えますが、どのように機能するのかわかりません。誰かがそれがどのように機能するか教えてもらえますか?

4

7 に答える 7

25

このコードの長い説明は、 http ://www.noulakaz.net/weblog/2007/03/18/a-regular-expression-to-check-for-prime-numbers/ にあります。

于 2008-09-29T01:53:14.253 に答える
20

これはおそらくかなりトピックから外れていますが、Ruby1.9では次のことができます。

 require 'mathn'
 38749711234868463.prime?
 => false
于 2010-01-18T19:58:27.267 に答える
3
require 'prime'

Prime.prime?(4)
# => false

Prime.prime?(5)
# => true

または:

require 'prime'

Prime.instance.prime?(4)
# => false

Prime.instance.prime?(5)
# => true
于 2014-04-01T08:44:46.097 に答える
2

これまでに使用した中で最も優れた正規表現は何ですか?も参照してください。(そして、はい、この正規表現が最初に Abigail によって書かれたことを確認できます。私は彼女がそれがどのように機能するかを説明しているのを聞いたことさえあります:)

于 2008-09-29T07:55:46.317 に答える
1

かなり良い説明のあるさらに別のブログ: Famous Perl One-Liners Explained (part III)

于 2010-01-18T20:35:37.380 に答える
1

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 のケースをチェックします。

于 2010-11-13T20:52:05.617 に答える
1

最大公約数 (gcd):

/^(1+)\1*=\1+$/.match('1' * x + '=' + '1' * y)[1].length

これと is_prime はどちらもほぼ同じように機能します。あきらめる前にすべての組み合わせを試します。

これは、最初の数字を偶数部分に分割し、2 番目の数字をそれらの部分の 1 つ以上と一致させようとします。一致するものが見つかった場合は、選択した部分の長さを返します。

于 2008-09-29T07:42:39.797 に答える