给定的字符串有多少台台呢?


11

如果满足以下条件,我们将一个非空字符串列表称为台面

  1. 每个列出的字符串都是非空的,并且仅使用第一个字符串中出现的字符。
  2. 每个连续的字符串都比前一个字符串长一个字符。
  3. 在列表中没有字符串是一个序列列表中的任何其他字符串。

术语“ mesa”来自这样的可视化(其中xs是各种字符):

    xx..x
    xx..xx
    xx..xxx
    .
    .
    .
    xx..xxx..x 

注意:这是一个数学事实,只有有限的台面以给定的字符串开头。注意序列子字符串之间的区别;例如,“安娜”是“香蕉”的子序列(但不是子字符串)。

挑战:

  • 编写最短的程序,该程序采用任意的非空字母数字输入字符串,并输出以该字符串开头的台面数目。

输入(stdin):

  • 任何非空的字母数字字符串。

输出(标准输出):

  • 以输入字符串开头的台面数量。

得分:

  • 获胜者是字节数最少的程序。

台面示例

只有一个台面以a

a

只有一个台面以aa

aa

许多台面开始于ab

ab        ab        ab        ab        (and so on)
          baa       aaa       bbb
                    bbba      bbaa
                              baaaa
                              aaaaaa

如何确定台面的唯一性?举例来说,我可以有abbbb如台面只是在第二项停止。那有效吗?还是总是必须使它们尽可能长?此外,如果是多个可能的重排nth项(如baaabaaab),难道他们都算作单独的台面,以及(提供当然它们都遵循规则)?
mellamokb

@mellamokb-如果它们完全不同,它们就是不同的mesas。例如abab/baaab/bbbab/bbb/bbaaab/bbb/bbaa/baaaaab/bbb/bbaa/baaaa/aaaaaa是不同的台地。
res 2012年

@mellamokb-您提出了其他好的问题;例如,从给定的字符串开始有多少个最大长度的台面,以及最大长度是多少。这些问题的其他版本将修复给定大小的字母(将以字母大小作为输入),并考虑仅使用给定字母表中的字母的所有台面(在没有条件#1的情况下重新定义)-同样,数量有限。
res 2012年

Answers:



2

Ruby,142个字符

m=->l{[*l[0].chars].repeated_permutation(l[-1].size+1).reduce(1){|s,x|l.any?{|y|x*''=~/#{[*y.chars]*'.*'}/}?s:s+m[l+[x*'']]}}
p m[[gets.chop]]

该算法是建设性的,即它为输入字符串构建所有可能的台面并对其进行计数。它使程序确实非常缓慢-但是,嘿,它是codegolf。

示例运行:

> a
1
> aa
1
> ab
43

我希望所有以长度3(例如aab)的非平凡二进制字符串开头的台面都具有可行的长度,但是我不确定-在该示例中,您的程序已经运行了大约一个小时。注意:对于任何涉及两个以上不同字母的输入,将没有可行的输出;例如,一些始于台面的台面abc长度大于7000th Ackermann数
2012年

我用C#构建了一个优化版本,在生成300,000条目后,aab我仍然看到前10个左右的术语完全相同。因此,我认为对于大于两个字符的任何内容都不可行。至少,并非没有一些智能和启发式计算。
mellamokb '04 -4-24
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.