会重复吗?


20

如果一个字符串包含两个相等的连续子字符串,则重复该字符串。

例如,连续2034384538452重复3845两次,因为它包含两次。

因此,您面临的挑战是确定字符串是否包含重复的子字符串。您可以将输入作为字符串或字符数组。

您将永远不会收到空的输入,并且子字符串的长度(如果存在)可能为1或更大。

我使用10这里作为我的真实和虚假价值观,但您可以使用其他值,只要它们在您的语言中是真实和虚假的即可。

例子:

abcab -> 0
bdefdefg -> 1
Hello, World! -> 1
pp.pp/pp -> 1
q -> 0
21020121012021020120210121020121012021012102012021020121012021020120210121020120210201210120210121020121012021020120210121020121012021012102012021020121012021012102012101202102012021012102012021020121012021020120210121020121012021012102012021020121012021020120210121020120210201210120210121020121012021020120210121020120210201210120210201202101210201210120210121020120210201210120210121020121012021020120210121020121012021012102012021020121012021020120210121020120210201210120210121020121012021020120 -> 0

(最后一个示例是从Thue-Morse序列中每个零之间的一的数量产生的)


2
我可以使用不一致的值,只要它们仍然适当地为真或假?
暴民埃里克(Erik the Outgolfer)

@EriktheOutgolfer当然
Okx

@trichoplax我想他是指> = 1长度的连续的子序列
埃里克Outgolfer

我错过了@EriktheOutgolfer“连续”这个词。谢谢-这很有意义。
trichoplax

我们可以输出1代表错误,0代表真实吗?
Kritixi Lithos

Answers:




7

果冻6 5字节

Ẇµ;"f

这是一个完整程序。TIO无法不截断最后一个测试用例。

在线尝试!(最后一个测试用例被截断为250位)

怎么运行的

Ẇµ;"f  Main link. Argument: s (string)

Ẇ      Words; generate all substrings of s.
 µ     New chain. Argument: A (substring array)
  ;"   Vectorized concatenation; concatenate each substring with itself.
    f  Filter; keep "doubled" substrings that are also substrings.
       This keeps non-empty string iff the output should be truthy, producing
       non-empty output (truthy) in this case and empty output (falsy) otherwise.

5

Mathematica,32个字节

StringMatchQ[___~~x__~~x__~~___]

这是否不要求重复的字符串子段相邻?
DavidC

1
@Svetlana,你是对的!我没有考虑abcab-> 0。
DavidC

1
StringContainsQ[x__~~x__]而且!StringFreeQ[#,x__~~x__]&都较短。
ngenisis


5

05AB1E,5个字节

Œ2×åZ

在线尝试!

输出1作为真实值,0作为错误值

说明

Œ2×åZ
Œ     # Substrings of input
 2×   # duplicate them (vectorized)
   å  # Is the element in the input? (vectorized)
    Z # Maximum value from list of elements

4

Python,38个字节

import re
re.compile(r'(.+)\1').search

在线尝试!

打哈欠,一个正则表达式。检查字符串是否包含一个或多个其他字符之一的.+字符串,然后是刚刚捕获的相同字符串。如果存在至少一个匹配项,则输出搜索对象为Truthy,可以通过进行检查bool

使用compile此处可节省编写lambda的时间:

lambda s:re.search(r'(.+)\1',s)

Python,54个字节

f=lambda s:s>''and(s in(s*2)[1:-1])|f(s[1:])|f(s[:-1])

在线尝试!

搜索一个是由串联两个或两个以上相同字符串,如通过检查字符串s in(s*2)[1:-1]作为这个答案。通过选择剪切第一个或最后一个字符来递归生成子字符串。这是指数的,因此在大型测试用例上会超时。

差点错过:

f=lambda s,p='':s and(s==p)*s+f(s[1:],p+s[0])+f(s[:-1])
f=lambda s,i=1:s[i:]and(2*s[:i]in s)*s+f(s[1:])+f(s,i+1)

第一个不使用Python in来检查子字符串,因此可以适用于其他语言。


4

Pyth- 10 9 8个字节

f}+TTQ.:

返回所有重复子字符串的列表(如果没有,则为空列表,虚假)

试试吧

说明:

f}+TTQ.:
      .:    # All substrings of the input (implicit):
f           # filter the list of substrings T by whether...
  +TT       # ...the concatenation of the substring with itself...
 }   Q      # ...is a substring of the input

1
如果您认为输入用引号引起来,则f}+TTQ.:可以少使用1个字节: 链接
KarlKastor




2

Perl 6、11个字节

{?/(.+)$0/}

测试一下

展开:

{        # bare block lambda with implicit parameter 「$_」

  ?      # Boolify the following
         # (need something here so it runs the regex instead of returning it)

  /      # a regex that implicitly matches against 「$_」
    (.+) # one or more characters stored in $0
     $0  # that string of characters again
  /
}

2

PHP,32字节

<?=preg_match('#(.+)\1#',$argn);

与一起作为管道运行-F。抱歉,约尔格,我没注意到您张贴了同样的内容

非正则表达式版本,84 82字节

    for($s=$argn;++$e;)for($i=0;~$s[$i];)substr($s,$i,$e)==substr($s,$e+$i++,$e)&&die

退出并返回代码0以重复一次,超时(错误退出)为空。与一起作为管道运行-nr
假定可打印的ASCII输入;更换~a&任何ASCII。


1

JavaScript(ES6),19个字节

s=>/(.+)\1/.test(s)

怎么/(.+)\1/.test
路加福音

那就是我所拥有的,@ Luke。
粗野的

@Shaggy我相信他的意思/(.+)\1/.test是完整的陈述。
Leaky Nun

@Luke /(.+)\1/.test未绑定(无this)。f=/(.+)\1/.test;f('aa')例如,将不起作用。您需要/./.test.bind(/(.+)\1/)
Artyer

您可以打高尔夫球:::/(.+)\1/.test(15位元组)
Downgoat '17


1

V,6个字节

ø¨.«©±

在线尝试!

测试套件!

程序输出0假数值,并输出正整数表示正值。

(请注意,这是一个小错误,因此我必须获得1个字节。现在,在错误修复后,我将可以替换\x82

说明

ø                     " This is a recent addition to V. This command takes in a regex
                      " and replaces the line with the number of matches of the regex
 ¨.«©±                " The compressed regex. This decompresses to \(.\+\)\1

1

Japt,8 +1 = 9 8字节

f"(.+)%1

在线尝试nullfalsy的输出,以及包含true的所有重复字符串的数组。

说明

 f"(.+)%1
Uf"(.+)%1" # Implicit input and string termination
Uf         # Find in the input
  "(.+)%1" #   a sequence followed by itself
 f         # and return the matched substring
           # output the return value

允许不一致的输出值,因此您可以è用来返回匹配数并删除标志。
毛茸茸的

是的 我也可以放下标记以返回匹配本身,因为没有匹配返回null,这是虚假的。
路加福音

对于输入00,它输出00。您确定这在Japt中是真的吗?
Okx

@Okx字符串"00"是。
ETHproductions

@Okx; 试试这个。该-Q标志“prettyprints”输出,所以你可以看到,它包含一个字符串数组。
毛茸茸的

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.