【问题标题】:Ternary Numbers, regex三进制数,正则表达式
【发布时间】:2012-04-19 17:56:27
【问题描述】:

我正在寻找一些正则表达式/自动机帮助。我仅限于+ 或 Kleene Star。解析表示三进制数的字符串(如二进制,只有 3),我需要能够知道结果是否为 1 小于 4 的倍数。

所以,例如120 = 0*1+2*3+1*9 = 9+6 = 15 = 16-1 = 4(n)-1

即使是指向模式的指针也会很有帮助!

【问题讨论】:

  • 我在这里对编码竞赛的回答:codegolf.stackexchange.com/questions/3503/… 为您提供了一个测试不同数字基数的可分性的示例。那将是一个很好的指针。
  • 谢谢。到目前为止,我有一些规则,但还没有确定的规则
  • 我的建议是生成一个 FSM/正则表达式,用于测试 4 的三元整除性。如果您修改我的 NFA 中的规则,这应该不会太难。一旦你有了它,为“-1”位调整你的解决方案是微不足道的。

标签: regex automata ternary-representation


【解决方案1】:

您可以生成一系列值,以便在 bash 中使用 bc 进行一些观察:

for n in {1..40}; do v=$((4*n-1)); echo -en $v"\t"; echo "ibase=10;obase=3;$v" | bc ; done 

3   10
7   21
11  102
15  120
19  201
23  212
27  1000
31  1011
...

【讨论】:

    【解决方案2】:

    请注意,每个数字的值(十进制)比可被 4 整除的值交替地多 1 或小 1。所以第 1(lsb)位是 0 多一,第 3(第 2)位是比 4 少 1,第 9(第 3)位是比 8 多 1,第 27(第 4)位是比 28 少 1,依此类推.
    如果将所有偶数位和所有奇数位相加,然后将奇数位加 1(如果从 1 开始计数),您应该得到相等。

    在您的示例中:奇数:(0+1)+1,偶数:(2)。所以它们是相等的,所以这个数是 4n-1 的形式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多