('1' * N) !~ /^1?$|^(11+?)\1+$/
在网上,我发现这段 Ruby 代码适用于 N >= 0,它确定 N 是否为素数。据我所知,它看起来像是在玩正则表达式,但我不知道它是如何工作的。有人可以告诉我它是如何工作的吗?
您可以在此处找到此代码的详细说明: 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
另请参阅您使用过的最出色的正则表达式是什么?(是的,我可以确认这个正则表达式最初是由 Abigail 编写的。我什至听过她解释它是如何工作的 :)
最大公约数(gcd):
/^(1+)\1*=\1+$/.match('1' * x + '=' + '1' * y)[1].length
这和 is_prime 都以大致相同的方式工作。它会在放弃之前尝试所有组合。
这个将尝试将第一个数字分成偶数部分,并将第二个数字与这些部分中的一个或多个匹配。如果找到匹配项,则返回所选部分的长度。
另一个有很好解释的博客:Famous Perl One-Liners Explained (part 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 情况。