【问题标题】:Ruby isPrime MethodRuby isPrime 方法
【发布时间】:2010-09-13 22:02:12
【问题描述】:
('1' * N) !~ /^1?$|^(11+?)\1+$/

在网上,我发现这段 Ruby 代码适用于 N >= 0,它确定 N 是否为素数。据我所知,它看起来像是在玩正则表达式,但我不知道它是如何工作的。有人可以告诉我它是如何工作的吗?

【问题讨论】:

  • 这真的是对 Ruby 晦涩语法的控诉吗?如果是这样,我完全同意 - 哇,这太晦涩难懂了!
  • “Ruby 晦涩的语法”是什么意思?正则表达式在所有语言中看起来都差不多,不是吗?
  • 这只是一个不起眼的正则表达式,它实际上与 ruby​​ 无关
  • 哇!我很感动,真的。但这会起作用,因为这是 POSIX 正则表达式。通常,我们无法构建将接受/拒绝主数的确定性有限状态机,并且据我所知 DFA 正则表达式。所以这不是正则表达式的属性,而是 posix 正则表达式的属性
  • 这个的 O-notation 运行时间是多少?有人知道吗?

标签: ruby regex primes


【解决方案1】:

【讨论】:

  • 谢谢。如果它首先来自 Perl 程序员,我会很高兴。
【解决方案2】:

最大公约数 (gcd):

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

this 和 is_prime 的工作方式大致相同。它会在放弃之前尝试所有组合。

这会尝试将第一个数字分成偶数部分,并将第二个数字与这些部分中的一个或多个匹配。如果找到匹配项,则返回所选部分的长度。

【讨论】:

    【解决方案3】:

    另见What is the most brilliant regex you’ve ever used?(是的,我可以确认这个正则表达式最初是由 Abigail 编写的。我什至听过她解释它是如何工作的 :)

    【讨论】:

      【解决方案4】:

      这可能有点离题,但在 Ruby 1.9 中,您可以这样做:

       require 'mathn'
       38749711234868463.prime?
       => false
      

      【讨论】:

        【解决方案5】:

        又一个有很好解释的博客:Famous Perl One-Liners Explained (part III)

        【讨论】:

          【解决方案6】:

          如果一个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 情况。

          【讨论】:

            【解决方案7】:
            require 'prime'
            
            Prime.prime?(4)
            # => false
            
            Prime.prime?(5)
            # => true
            

            或者:

            require 'prime'
            
            Prime.instance.prime?(4)
            # => false
            
            Prime.instance.prime?(5)
            # => true
            

            【讨论】:

              猜你喜欢
              • 2020-10-31
              • 2012-09-24
              • 2014-01-14
              • 1970-01-01
              • 2012-03-13
              • 2021-01-19
              • 1970-01-01
              • 2021-01-06
              • 2018-08-07
              相关资源
              最近更新 更多