这是唯一可串联的吗?


10

关于前缀代码的挑战中,我们了解到前缀代码是唯一可串联的。

这意味着它们可以在没有分隔符且没有歧义的情况下连接在一起。

例如,由于[1,2,45]是前缀代码,因此我可以将它们连接在一起而无需使用分隔符,例如1245245112145,这样就不会产生歧义。

然而,相反的情况并不总是正确的。

例如,[3,34]不是前缀代码。但是,我可以这样做:3333434334333,并且不会有任何歧义。您只需要一个更智能的解析器即可。

但是,[1,11]不是唯一可串联的,因为1111可以用5种方式解释。

目标

您的任务是编写一个将字符串列表(ASCII)作为输入的程序/函数,并确定它们是否是唯一可串联的。

细节

重复计数为假。

计分

这是。以字节为单位的最短解决方案获胜。

测试用例

真正:

[12,21,112]
[12,112,1112]
[3,4,35]
[2,3,352]

假:

[1,1]
[1,2,112]
[1,23,4,12,34]
[1,2,35,4,123,58,8]

只是为了确保我正确理解了挑战,如果其中一个字符串由其他字符串的任意组合组成,它不是唯一可串联的吗?您应该使这些细节更加清晰。
詹姆斯,

您确定这不等于暂停问题吗?
feersum '16

您能证明为什么这等同于暂停问题吗?
Leaky Nun

我没有说是,但是想知道可能是。经过一番思考之后,我相信事实并非如此。
feersum '16

@feersum这是用于解决此问题的
多重

Answers:


5

05AB1E,15个字节

在电话上,因此稍后将进行解释。码:

gF¹N>ã})€`€JDÚQ

使用CP-1252编码。在线尝试!

最后一个测试用例占用过多内存,因此可能无法正常工作...


3
您能够在手机上键入它,真是令人印象深刻。
詹姆斯,

3
@DrGreenEg​​gsandHamDJ花了大约40分钟的时间
阿德南

2
@Adnan我想知道您的电话键盘的文本预测变量如何看待所有这些垃圾符号:-)
Luis Mendo

1
@LuisMendo Haha,只有在我向朋友发送了一个随机的05AB1E程序后才发生。
阿德南

我猜想这是通过在最短碰撞的长度上设置上限来实现的。我对吗?
彼得·泰勒

4

CJam(54字节)

q_N/:A\,{_Am*:${~1$,<=},{~\,>}%La:L-}*A,A_&,-A*](\M*&!

将stdin上的输入作为换行符分隔的列表。

在线演示

如果我们不必处理重复的代码字,则可以将其缩短为44:

q_N/\,{_W$m*:${~1$,<=},{~\,>}%La:L-}*](\M*&!

或者如果CJam有一个数组减法,它只从第一个列表中删除了第二个中的每个项目,则可能是48 ...

解剖

这是Sardinas-Patterson算法,但未优化。由于每个悬挂的后缀最多只能出现一次,因此,只要输入中包含字符(包括分隔符)的次数运行主循环数就足够了。

请注意,我必须解决CJam解释器中可能是一个错误的问题:

"abc" "a" #   e# gives 0 as the index at which "a" is found
"abc" "d" #   e# gives -1 as the index at which "d" is found
"abc" ""  #   e# gives an error

因此前缀检查很复杂,1$,<=而不是\#!

e# Take input, split, loop once per char
q_N/\,{
  e# Build the suffixes corresponding to top-of-stack and bottom-of-stack
  _W$m*
  e# Map each pair of Cartesian product to the suffix if one is the prefix of the other;
  e# otherwise remove from the array
  :${~1$,<=},{~\,>}%
  e# Filter out empty suffixes iff it's the first time round the loop
  La:L-
}*
e# If we generated an empty suffix then we've also looped enough times to generate all
e# of the keywords as suffixes corresponding to the empty fix, so do a set intersection
e# to test this condition.
](\M*&!
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.