矮胖回文


15

回文报很有趣,但是其他一些字符串却开始被忽略。通过将这些字符串分成回文的大块数组,可以将它们变成大块的回文

例如,"abcabca"如果我们逐个字符地读取字符串,那么它就不是回文,但是有三种不同的方式可以使它成为大块的回文:

["abcabca"]
["a" "bcabc" "a"]
["a" "bc" "a" "bc" "a"]

如您所见,矮胖回文是一个非常包容的概念;每个字符串都可以至少以一种方式变成粗大的回文。

任务

编写一个程序或函数,该程序或函数接收字符串作为输入,并返回其回文式块状体,即回文式数组的分区数。

测试用例

 OUTPUT | INPUT
--------+---------------------------------------------
      1 | ""                                          
      1 | "a"                                         
      1 | "ab"                                        
      2 | "aa"                                        
      2 | "aaa"                                       
      3 | "abcabca"                                   
      4 | "abababab"                                  
     28 | "abcabcaabababababcabca"                    
      1 | "bbbbabababbbbababbbaaaaa"                  
     20 | "ababbaaaabababbbaaabbbaa"                  
      5 | "baaabaabababaababaaabbaab"                 
     62 | "bbaaababbabbabbbabaabaabb"                 
      2 | "a man a plan a canal panama"               
     25 | "ama nap lan aca nal pan ama"               
     93 | "SATOR   AREPO   TENET   OPERA   ROTAS"     
    976 | "abcabcaabcabcaabcabcaabcabcaabcabcaabcabca"
  28657 | "ababababababababababaababababababababababa"
2097152 | "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

附加规则

  • 您可能会假设输入将包含42个或更少的可打印ASCII字符,并可选地用您的语言的字符串定界符和/或后跟换行符。

  • 对于每个有效的输入字符串,您的代码必须在我的机器上(Intel Core i7-3770、16 GiB RAM,Fedora 21)在不到一分钟的时间内完成

    使用适当的算法,应该很容易遵守此时间限制。但是,您很可能无法遍历输入字符串的所有分区。

  • 如果选择将输出打印到STDOUT,则可以在其后跟一个换行符。

  • 适用标准规则。

Answers:


4

Pyth, 40 34 27 22字节

Lhsmy:bd_df!xb>TbS/lb2

在在线解释器中尝试一下

从最初的40字节版本开始大量使用。感谢FryAmTheEggman指出了几个有用的运算符(难以搜索文档!),总共节省了6个字节。感谢Dennis通过将结果解释x为真实/虚假值而不是索引- !xb>Tb来节省了单个字节q<bT>Tb


怎么运行的:

我们定义了一个函数y,该函数b通过在的子字符串上递归调用自身来确定字符串的块状性b。函数会自动在Pyth中存储,因此递归在时间上的开销很小。

L                              def y(b): return ___
                 S/lb2         The range [1,2,...,len(b)/2]
          f!xb>Tb              Filter n for which b[:n] == b[-n:]
   m                           Map each n in the list to...
    y:bd_d                     y(b[d:-d])       
 hs                            Take the sum and add one (implicit return)

是的,学习Pyth的大部分时间都是公共的/反复试验的/阅读词法分析器的,打高尔夫的好方法更多!:)
FryAmTheEggman 2015年

1
1.您可以通过提交函数来保存两个字节。无需使用调用yz。2.除了使用两个映射和一个过滤器外,您还可以使用一个映射和一个条件(链接)来节省三个字节。
丹尼斯

2

果酱(41 39字节)

qM{_,2/,\f{\~_2$>@2$<@~)/(@=\M*j*}1b)}j

在线演示

从某种意义上说,这是“渴望的”,因为它找到了每个“中央”字符串的矮胖回文数(即从原始字符串的两端删除了相同数量的字符的结果),但是因为它使用了自动记忆j每个运算符仅计算一次,从而提供了非常快速的程序(并且在非记忆实现中节省了一些字符)。

感谢Dennis节省了一个字节。


1

Mathematica,77 72 57字节

1+Tr[#0/@ReplaceList[#,{a__,b___,a__}:>{b}]]&@*Characters

1

Perl,86个字节

84字节代码+ 2个开关

有一种更短的方法,但是这里有:

perl -lpe 'sub c{my($x,$i)=@_;$x=~/^(.{$i})(.*)\1$/&&c($2,0*++$s)while++$i<length$x}c$_;$_=++$s'

从STDIN接受输入,每行一个字符串。

说明:对于values 1<=$i<length(input string),使用正则表达式/^(.{$i})(.*)\1$/获取左右块并增加计数。然后,递归地对字符串的中心部分执行相同的操作。

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.