날 따라와!


23

문자열을 인수로 지정하면 가장 긴 겹치지 않는 반복 하위 문자열의 길이를 출력하거나 해당 문자열이 없으면 0을 출력하십시오.

입력 문자열이 비어 있지 않다고 가정 할 수 있습니다.

abcdefabc: 부분 문자열 abc은 위치 1과 7에서 반복되므로 프로그램은 3 을 출력해야합니다.

abcabcabcabcab: abcabc또는 bcabca또는 cabcab반복되므로 프로그램에서 출력해야합니다 6 . (하위 문자열 abcabcabcab도 반복되지만 발생은 겹치므로 수락하지 않습니다).

aaaaaaa: aaa예를 들어 위치 1과 4에서 반복되므로 프로그램은 3 을 출력해야합니다.

abcda: a이 반복되므로 프로그램은 1 을 출력해야합니다

xyz: 반복되는 문자열이 없음 → 0

ababcabcabcabcab: 6 을 반환해야합니다

이것은 이므로 가장 적은 바이트가 이깁니다.


1
문자열이 비어있을 수 있습니까? 이 경우 0이 아닌 False 를 출력 할 수 있습니까?
Dennis

@Dennis 문자열이 비어 있지 않다고 가정 할 수 있습니다.
Arnaud

답변:


9

brainfuck, 226 바이트

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

형식화 :

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

후행 줄 바꿈이 있거나없는 입력을 예상하고 결과를 바이트 값 으로 출력합니다 .

온라인으로 사용해보십시오.

이렇게하면 각 접두사를 확인하여 나중에 문자열에서 발생하는지 확인한 다음 첫 문자를 잘라 내고 문자가 더 이상 없을 때까지 프로세스를 반복합니다.

테이프는 3 셀 노드로 나뉩니다.

c 0 f

여기서 c주어진 문자열의 문자이며 f1, 음수 또는 0 일 수있는 플래그입니다. 현재 비교중인 두 문자 사이에 0이 아닌 플래그가 배치되고 현재 접두어 종료 후와 현재 접미어 시작 이전 (즉, 현재 전위 일치 색인 이전)에 셀에 대해 음수 플래그가 예약됩니다.

결과는 문자열 왼쪽에 저장되며 일치하는 항목이 발견 될 때마다 업데이트됩니다.

(문자열은 실제로 \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
최고의 코드 골프 언어 인 우박 젤리!
Nissa

œ-Q정말 깔끔합니다.
Lynn

5

펄 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%`.번째 단계로 사용하여 2 바이트를 절약 할 수 있습니다 .
Martin Ender

4

자바 스크립트 (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

하스켈 , 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 axayaa에 대해 2와 같은 잘못된 긍정을 제공 할 수 있습니다 .
xnor

@ xnor가 말한 것. 재귀 호출 a%d이 잘못되었지만 필요하지 않다고 생각합니다 . 또한 max대신에 사용할 수 있음을 의미합니다 maximum.
Ørjan Johansen

1
나는 그것을 고치기 a%d위해 변화한다고 생각 ""%d한다.
xnor

아, a비어 있을 때 여전히 필요하고 소리가납니다 .
Ørjan Johansen 2018

1
sum[1|(x,y)<-zip a c,x==y]대신 사용할 수 있다고 생각 a!c합니다.
Laikoni


2

자바 스크립트, 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

온라인으로 사용해보십시오!

참고 : Husk는이 문제보다 최신입니다.

설명

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->All. Max@StringLength@StringCases[#,a___~~___~~a___:>a,Overlaps->All]&괜찮을 것입니다.
JungHwan Min

@JungHwanMin 고마워요 StringReplace: P
LegionMammal978


1

클로저, 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 - 1( n문자열 길이)하고 j문자를 삭제 하고 나머지를 "시작"및 "종료"부분으로 분할합니다. e길이가 긴 모든 하위 문자열 집합을 만들고 b함수를 사용하여 해당 문자열 b이 발견 되었는지 확인합니다 . b발견 된 경우 의 길이를 리턴하고 그렇지 않으면 0을 리턴하고 이러한 값의 최대 값을 리턴합니다.

더 짧은 버전을 보는 것이 흥미로울 것입니다.


1

레티 나 , 24 바이트

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

온라인으로 사용해보십시오!

Retina 1의 새로운 기능을 배우기위한 준비 운동입니다.

설명

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

List 스테이지는 정규식에 대한 모든 일치를 리턴하며, (.*).*\1"ABA"형식의 패턴과 일치합니다. 여기서 A와 B는 두 개의 임의의 하위 문자열 (비어있을 수 있음)입니다. 이 단계에 제공된 추가 옵션은 v중복 일치를 고려하고 $반환하기 전에 각 일치에 대체를 적용합니다. 대체는 두 번째 줄에 표시되며 .첫 번째 캡처 그룹 의 길이 ( )에 해당합니다 ( 이는 이전 예에서 하위 문자열 "A"입니다.

N`

우리는 이제 반복되는 부분 문자열의 모든 길이를 가졌으며,이 단계는 그것들을 가장 짧은 것부터 가장 긴 것까지 숫자 순으로 정렬합니다.

G-1`

마지막으로,이 grep 스테이지 ( G) -1는 가장 긴 반복 서브 스트링의 길이 인 마지막 ( ) 결과 만 유지합니다 .


0

자바 스크립트, 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이 반복됩니다.
Dennis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.