반복 되나요?


20

동일한 두 개의 연속 하위 문자열이 포함 된 경우 문자열이 반복됩니다.

예를 들어, 연속으로 두 번 2034384538452포함 된대로 반복합니다 3845.

따라서 문자열에 반복 하위 문자열이 포함되어 있는지 여부를 결정해야합니다. 입력을 문자열 또는 문자 배열로 사용할 수 있습니다.

빈 입력은받지 않으며 하위 문자열의 길이 (있는 경우)는 1 이상이 될 수 있습니다.

내가 사용 1하고 0여기 내 truthy 및 falsy 값으로,하지만 당신은 그들이 당신의 언어 truthy 및 falsy 한, 다른 값을 사용할 수 있습니다.

예 :

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

(마지막 예제는 Thue-Morse 시퀀스에서 각 0 사이의 1의 양에서 생성되었습니다)


2
여전히 적절하거나 진실 된 한 일관성이없는 값을 사용할 수 있습니까?
Outgolfer Erik

@EriktheOutgolfer 물론
Okx

나는 그가> = 1 길이의 연속 서브 의미한다고 생각 @trichoplax
에릭 Outgolfer

@EriktheOutgolfer "연속"은 내가 놓친 단어였습니다. 감사합니다-이제 완벽하게 이해됩니다.
trichoplax 2016 년

우리는 1을 거짓으로 출력하고 0을 진실로 출력 할 수 있습니까?
Kritixi Lithos 2016 년

답변:




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

수학, 32 바이트

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

반복되는 문자열 하위 세그먼트가 인접하지 않아도됩니까?
DavidC

1
@ 스베틀라나, 당신은 맞습니다! 나는 abcab-> 0을 고려하지 않았습니다.
DavidC

1
StringContainsQ[x__~~x__]그리고 !StringFreeQ[#,x__~~x__]&모두 짧다.
ngenisis 2016 년

5

자바, 27 바이트

a->a.matches(".*(.+)\\1.*")

Retina answer 의 복제본과 거의 비슷 하지만 Java가 더 짧아지는 방법은 없습니다.


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

파이썬 , 38 바이트

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

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

하품, 정규식. .+문자열에 방금 캡처 된 동일한 문자열 다음에 하나 이상의 문자가 포함 된 문자열이 있는지 확인합니다 . 에서 확인할 수 있듯이 일치하는 항목이 하나 이상있는 경우 출력 검색 개체는 Truthy bool입니다.

compile여기를 사용 하면 람다를 쓰지 않아도됩니다.

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

파이썬 , 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)

첫 번째는 in하위 문자열을 검사 하기 위해 Python을 사용하지 않으므로 다른 언어에 맞게 조정할 수 있습니다.


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 바이트 이하에서 작동합니다. link
KarlKastor




2

펄 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. 죄송합니다 Jörg, 귀하가 같은 게시물을 올린 것을 눈치 채지 못했습니다 .

비정규 버전, 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

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


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

apt, 8 + 1 = 9 8 바이트

f"(.+)%1

온라인으로 사용해보십시오 . 출력null거짓에 대한 및 진실성을 위해 반복되는 모든 문자열을 포함하는 배열.

설명

 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

일치하지 않는 출력 값이 허용되므로 è일치 횟수를 리턴하고 플래그를 제거 할 수 있습니다 .
얽히고 설킨

네. 또한 일치하는 return이 없기 때문에 플래그를 삭제하여 일치 자체를 반환 할 수 있습니다 null.
Luke

입력시 00출력 00합니다. Japt에서 이것이 진실이라고 확신합니까?
Okx

@Okx 문자열 "00"입니다.
ETHproductions

@Okx; 이것을 시도 하십시오 . -Q플래그 "prettyprints는"당신은 하나의 문자열을 포함하는 배열의 것을 출력 볼 수 있습니다.
얽히고 설킨

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.