跟着我重复!


23

给定一个字符串作为参数,输出最长的不重叠重复子字符串的长度;如果没有这样的字符串,则输出零。

您可以假设输入字符串不为空。

例子

abcdefabc:子字符串abc在位置1和7处重复,因此程序应输出3

abcabcabcabcababcabcbcabcaor cabcab重复,因此程序应输出6。(子字符串abcabcabcab也被重复,但是出现的部分重叠,因此我们不接受它)。

aaaaaaaaaa例如在位置1和4处重复,因此程序应输出3

abcdaa重复,因此程序应输出1

xyz:没有重复的字符串→ 0

ababcabcabcabcab:应返回6

这是,因此最少的字节获胜。


1
字符串可以为空吗?如果是这样,是否允许输出False而不是0
丹尼斯

@Dennis您可以假定字符串不为空。
Arnaud

Answers:


9

疯子,226字节

,[<<<,]+[>>->[[[[>>[>>>]<+<-<[<<<]>>+<-]>[<+>-]>[>>>]<<[>[<+>-]]>[[<+>-]>+[<<<]>
>>-[+>[<<<]<[>+>[->]<<[<]>-]>[<+>>+<-]>>>[>>>]]>>]<]>+[,<<<+]->[<<<]>>>>>+[,+>>>
+]-[>>>]->]<[+<<<]+<<<++[->>>]+>>>->]<[,<<<]<[>>>+<<<-]>+>,>>>]<<.

格式:

,[<<<,]
+
[
  for each suffix
  >>->
  [
    for each prefix
    [
      for each suffix
      [
        for each char while no mismatch
        [
          >>[>>>]
          <+<-<[<<<]
          > >+<-
        ]
        >[<+>-]
        >[>>>]
        <<
        [
          mismatch
          >[<+>-]
        ]
        >
        [
          [<+>-]
          >+[<<<]
          >>>-
          [
            match
            +>[<<<]
            <
            [
              >+>[->]
              <<[<]
              >-
            ]
            >[<+> >+<-]
            >>>[>>>]
          ]
          >>
        ]
        <
      ]
      >+[,<<<+]
      ->[<<<]
      >>> >>+[,+>>>+]
      -[>>>]
      ->
    ]
    <[+<<<]
    +<<<++[->>>]
    +>>>->
  ]
  <[,<<<]
  <[>>>+<<<-]
  >+>,>>>
]
<<.

期望输入有或没有尾随换行符,并将结果输出为字节值

在线尝试。

这将检查每个前缀,以查看它是否出现在字符串的后面,然后将第一个字符切掉,然后重复该过程,直到没有剩余的字符为止。

磁带分为3个单元,

c 0 f

哪里 c是给定字符串的字符,并且f是可以为1,负1或零的标志。非零标志放置在当前正在比较的两个字符之间,在当前前缀的结尾之后和当前后缀的开始之前(即,在当前电位匹配的索引之前)为单元格保留负的标志。

结果存储在字符串的左侧,并在找到匹配项时进行更新。

(该字符串实际上是反向处理的,并\x01附加了一个字符串。)


6

果冻,12字节

œ-QL€
ŒṖÇ€FṀ

在线尝试!

怎么运行的

ŒṖÇ€FṀ  Main link. Argument: s (string)

ŒṖ      Generate all partitions of s.
  ǀ    Apply the helper link to each partition.
    F   Flatten the resulting array of lengths.
     Ṁ  Take the maximum.


œ-QL€   Helper link. Argument: P (partition)

  Q     Yield the elements of P, deduplicated.
œ-      Multiset subtraction; remove exactly one occurrence of each string in P.
   L€   Compute the lengths of the remaining strings. 

1
万岁,果冻,终极代言高尔夫语言!
妮莎

œ-Q真的很整洁。
林恩

5

Perl 6、36字节

{m:ex/(.*).*$0/.map(*[0].chars).max}

试试吧

展开:

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

  m           # match ( implicitly against 「$_」
  :exhaustive # every possible way
  /
    (.*)      # any number of characters ( stored in 「$0」 )
    .*
    $0
  /

  .map(

    *\        # the parameter to Whatever lambda
    [0]\      # the value that was in 「$0」 for that match
    .chars    # the number of characters

  ).max

}

5

视网膜35 32 30字节

非常酷的挑战。

M&!`(.*)(?=.*\1)
M%`.
O#^`
G1`

在线尝试

说明:

M&!`(.*)(?=.*\1)    # Prints overlapping greedy substrings occuring more than once
M%`.                # Replace each line with its length
O#^`                # Sort lines by number in reverse
G1`                 # Return the first line

您可以通过将其M%`.用作第二阶段来保存两个字节。
马丁·恩德

4

JavaScript(ES6),79 68 66字节

f=(s,r,l=s.match(/(.*).*\1/)[1].length)=>s?f(s.slice(1),l<r?r:l):r
<input oninput=o.textContent=f(this.value)><pre id=o>

编辑:由于@Arnauld,节省了11个 13字节。


4

Haskell,79个字节

(""%)
(a:b)!(c:d)|a==c=1+b!d
_!_=0
a%c@(e:d)=maximum[a!c,""%d,(a++[e])%d]
_%_=0

在线尝试!


2
似乎第一个论点%可以累积一个不连续的子序列,从而给aain 带来2的误报axayaa
xnor

@xnor说了什么。我认为对的递归调用a%d是错误的,但也是不必要的。这也意味着您可以使用max代替maximum
与Orjan约翰森

1
我认为需要更改a%d""%d解决它。
xnor18年

哦,对了,它a为空时仍然需要(和声音)。
与Orjan约翰森

1
我认为sum[1|(x,y)<-zip a c,x==y]可以代替a!c
Laikoni


2

JavaScript,120

function r(a,b,m){return b=-~b,t=a.slice(0,b),n=a.indexOf(t,b),m=b>m&&!~n?m:b,a!=t&&r(a,b,m)||(a?r(a.slice(1),m,m):~-m)}

2

外壳,11个字节

L►L§fo↓2`xQ

在线尝试!

注意:果壳比此挑战新。

说明

L►L§fo↓2`xQ  Implicit input, say x = "ababc"
          Q  Nonempty substrings: ["a","b","ab",..,"ababc"]
    f        Keep those that satisfy this:
              Take s = "ab" as an example.
   §    `x    Split x along s: ["","","c"]
     o↓2      Drop the first two pieces: ["c"]
              This is truthy (i.e. nonempty).
             Result is ["a","b","ab","a","b","ab"]
 ►L          Take element with maximal length: "ab"
             If the list is empty, "" is used instead.
L            Length: 2


1

Mathematica,75 65字节

@JingHwan Min节省了10个字节。

Max@StringLength@StringCases[#,a___~~___~~a___:>a,Overlaps->All]&

匿名函数。将字符串作为输入,并返回一个数字作为输出。


我认为您不需要开始和结束的BlankNullSequence (___)时间Overlaps->AllMax@StringLength@StringCases[#,a___~~___~~a___:>a,Overlaps->All]&很好。
JungHwan Min

@JungHwanMin谢谢,与StringReplace:P 混淆了
LegionMammal978


1

Clojure,112字节

#(apply max(for[R[(range(count %))]j R i R](let[[b e](split-at i(drop j %))](if((set(partition i 1 e))b)i 0)))))

在数字0上循环两次至n - 1n是字符串的长度),下降j字符并将其余部分分成“开始”和“结束”部分。创建一组所有e长度为substring的子字符串,b并将其用作函数来检查是否b从那里找到。返回的长度b如果找到则否则返回0,返回这些值的最大值。

看到一个简短的版本会很有趣。


1

视网膜,24字节

L$v`(.*).*\1
$.1
N`
G-1`

在线尝试!

我热身学习Retina 1的新功能。

说明

L$v`(.*).*\1
$.1

List阶段,它返回regex的所有匹配项,该(.*).*\1匹配项匹配任何形式为“ ABA”的模式,其中A和B是两个任意子字符串(可能为空)。在此阶段提供的其他选项是v,它考虑重叠的匹配项,并$在返回每个匹配项之前对其进行替换:替换项在第二行中指出,并且对应于.第一个捕获组的长度()(在上一个示例中为子字符串“ A”)。

N`

现在,我们拥有了所有重复子串的长度,此阶段仅按数字顺序(从最短到最长)对它们进行排序。

G-1`

最后,此grep阶段(G)仅保留最后(-1)个结果,即最后一个重复的子字符串的长度。


0

Javascript,165个字节

function a(s){var l=s.length/2,z=1,f='';while(z<=l){var t=s.substr(0,z),c=0;for(var i=0;i<s.length;i++){if(s.substr(i,z)===t){c++;if(c>1){f=t}}}z++}return f.length}

测试用例

console.log(a('abcabcabcabc')) // Output 6
console.log(a('xyz'))          // Output 0
console.log(a('aaaaaaa'));     // Output 3
console.log(a('abcdefabc'));   // Output 3

2
欢迎来到编程难题和代码高尔夫球。不幸的是,它返回2作为输入ababcabcabcabcab,但是字符串cabcab被重复。
丹尼斯
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.