문자열이 완전히 동일한 하위 문자열로 구성되어 있는지 확인


24

이것은 이 질문 에서 가져옵니다 (물론 허가가 있음). 나는 인용 할 것이다 :

문자열을받는 함수를 만들고 입력 이 반복되는 문자 시퀀스 만으로 구성되는지 여부에 따라 true 또는 false를 반환해야 합니다. 주어진 문자열의 길이는 항상 1보다 크며 문자 시퀀스에는 적어도 하나의 반복이 있어야합니다.

몇 가지 예 :

'aa' //true
'aaa' //true
'abcabcabc' //true
'aba' //false
'ababa' //false
'weqweqweqweqweqw' // false

특히 반복 하위 문자열 ( Update ) 로 엄격하게 구성된 문자열 검사는 true 또는 false 표현을 출력 할 수 있지만 오류 출력은 없습니다. 엄격하게 알프 하뉴 머 현. 그렇지 않으면 표준 코드 골프 규칙. 이것은 코드 골프이므로 각 언어 당 가장 짧은 답변은 바이트입니다.


4
흠, 난의 잘 속는 사람으로이 문제를 닫으려고 하나 ,하지만 글자 수의 다른 한 점수 것으로 나타났습니다. 그래서 우리는 대신 이것의 속임수로 다른 것을 닫아야 할 것입니다.
Outgolfer Erik

답변:


11

Brachylog , 4 3 바이트

ġ=Ṁ

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

설명

ġ=Ṁ    Implicit input, say "abcabc"
ġ      Split into chunks of equal lengths (except maybe the last one): ["abc","abc"]
 =     Apply the constraint that all of the chunks are equal,
  Ṁ    and that there are multiple of them.

true.제약 조건이 충족 될 수 false.있는지 여부 와 그렇지 않은 경우 프로그램이 인쇄 합니다 .


나는 당신이 이것을 한 시간 전에 게시 한 것을 알기 전에 비슷한 것을 얻 ~j↙거나 =Ṁc노력하기 위해 고심하고 있었습니다.
Unrelated String

4
오, 예, 이것은 1 바이트 더 짧을 수 있습니다 :ġ=Ṁ
관련없는 문자열

( 두 개 이상의 요소 목록으로 제한되는 변수입니다)
관련이없는 문자열

1
@UnrelatedString 감사합니다! 변수 위키 페이지를 확인하지 않았다.
Zgarb

1
많은 훌륭한 답변과 LUA 답변은 제 마음에 특별한 자리를 차지합니다. Arnauld의 답변은 특히이를 기반으로 한 원래 질문 (dupe이 아님)에 실제로 Javascript 태그가 지정되어 있기 때문에 특히 달콤합니다. 주로 모든 언어에 대해 전체적으로 가장 짧게 보이기 때문에이 언어를 선택하는데 이것이 첫 번째 질문이므로 배지를받습니다.
ouflak


9

그렙, 19

grep -qxE '(.+)\1+'

테스트

while read; do 
  <<<"$REPLY" grep -qxE '(.+)\1+' && t="true" || t="false"
  echo "$REPLY: $t"
done < infile 

산출:

aa: true
aaa: true
abcabcabc: true
aba: false
ababa: false
weqweqweqweqweqw: false

9

Japt , 6 바이트

²é ¤øU

@Shaggy 덕분에 1 바이트 절약

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

        Implicit input, stored in variable 'U'
²       U+U, "abcabc" -> "abcabcabcabc"
 é      Rotate 1 char to the right "abcabcabcabc" -> "cabcabcabcab"
   ¤    Remove first two chars, "cabcabcabcab" -> "bcabcabcab"
    øU  Check if U is in the above

니스 하나 : 당신은을 대체 할 수 p<space>²바이트를 저장합니다.
Shaggy

9

자바, 25 24 바이트

Olivier Grégoire 덕분에 -1 바이트!
지루한 정규식 답변

s->s.matches("(.+)\\1+")

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

그것은 지금 묶여 있는 파이썬 응답 aaaaa보다 1 바이트 길다. :)


3
메서드가 기본적으로 하위 문자열과 일치하지 않고 정확히 일치 하므로 최종 항목 $을 제거 할 수 있습니다 matches.
Olivier Grégoire

정규식에 matches자체 $를 추가하는 것을 잊었습니다 . 감사!
Benjamin Urquhart

7

엑셀, 26 바이트

=FIND(A1,A1&A1,2)<=LEN(A1)

A1의 입력은이 수식을 넣은 모든 셀에 출력됩니다.


단일 문자 범위 이름 (예 :)을 정의하고이를 A입력으로 설정 하면 4 바이트를 저장할 수 있습니다.
i_saw_drones

@i_saw_drones-표준 I / O 규칙에 의해 허용되지 않는다고 생각합니다. 다음은 해당 방법에 적용 되는 메타 답변에 대한 링크 입니다. 현재 -36 표입니다.
Sophia Lechner

나는 그 게시물을 보지 못했지만 사과했지만 A1입력 값을 포함하기 때문에 "가변"이 아닌가? :)
i_saw_drones

1
ROW (_)에 1을 사용하는 것과 같이 A1이라는 점에서 특별한 일을하고 있다면 그렇게 생각할 것입니다. 그렇지만 Excel 함수를 제공하는 가장 자연스러운 방법입니다. 임의의 입력.
Sophia Lechner

7

R , 28 바이트

grepl("(.+)\\1+$",scan(,''))

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

간단한 정규식 버전. R은 (때로는) 파이썬과 매우 비슷하므로 TFeld의 Python 2 정규식 답변과 비슷하지만 더 짧습니다!

질문 (누군가 답을 알고 있다면)

하위 문자열의 길이가 길고 항상 작동하기 때문에 "cABABABABAB"와 같은 유효한 문자열 앞에 문자를 추가 할 때 여전히 작동하는 이유가 여전히 혼란 스럽습니다. 개인적으로 정규식을 읽으면 (.+)길이에 관계없이 모든 그룹을 캡처하는을 볼 수 있습니다. 그런 다음 \\1+$끝까지 캡처 된 그룹을 여러 번 반복합니다.

그렇다면 왜 "AB"를 캡처하지 않고 문자열의 끝까지 반복되는지, 특히 부분 문자열을 시작할 수 있는지에 대한 제한이 없기 때문에 반복되지 않는 이유는 무엇입니까?


1
흥미롭게도, 이것은 R의 정규식 엔진의 버그 인 것 같습니다. 옵션 perl=TRUE을 추가하면 예상대로 cABABAB과 일치합니다. grep -E '(.*)\1+$'bash에서 실행 해도 cABABAB와 일치하지만 grep -EERE를 사용 하더라도 동일한 정규 표현식 R이 지원해야합니다.
그리미

2
내 생각에 이것은 잘못 적용된 최적화입니다. .+패턴 시작시 변경 ^.+하는 것이 중요한 최적화이지만 .+내부 캡처 패런 인 경우 유효하지 않습니다.
그리미


6

젤리 ,  5  4 바이트

이제 최적의 방법은 xnor의 방법 을 따르는 것입니다 !

Ḋ;Ṗw

문자 목록을 허용하고 반복 슬라이스의 가능한 가장 짧은 길이 또는 존재하지 않는 경우 0 인 정수를 출력하는 모나 딕 링크. 젤리에서는 0이 아닌 숫자는 진실이지만 0은 거짓입니다.

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

방법?

Ḋ;Ṗw - Link: list of characters, S   e.g. "abcabcabc"   or "abababa"
Ḋ    - dequeue S                           "bcabcabc"       "bababa"
  Ṗ  - pop from S                         "abcabcab"       "ababab"
 ;   - concatenate                "bcabcabcabcabcab"       "bababaababab"
   w - first index of sublist     3  ^---here!             0  (not found)







3

C # (Visual C # Interactive Compiler) , 70 바이트

xnor의 뻔뻔한 적응 ( 46 바이트 )

s=>(s+s).Substring(1,s.Length*2-2).Contains(s)

내 정규식 솔루션이 아닙니다.

s=>s.Select((x,y)=>y).Count(z=>s.Replace(s.Substring(0,z+1),"")=="")>1

설명:

인덱스 0에서 시작하는 가능한 모든 하위 문자열을 빈 문자열로 바꿉니다. 결과가 빈 문자열이면 문자열은 전적으로 해당 하위 문자열로 구성됩니다. 여기에는 전체 문자열 자체를 평가하는 것이 포함되므로 예상 결과의 양은 1보다 커야합니다.

예 : abcabc

인덱스 0에서 시작하는 가능한 하위 문자열 :

'a', 'ab', 'abc', 'abca', 'abcab', 'abcabc'

빈 문자열로 바꾸면

Substring          Result

'a'         =>     'bcbc'
'ab'        =>     'cc'
'abc'       =>     ''
'abca'      =>     'bc'
'abcab'     =>     'c'
'abcabc'    =>     ''

빈 문자열을 반환하는 'abcabc'이외의 하위 문자열이 있으므로 문자열은 완전히 다른 하위 문자열 ( 'abc')로 구성됩니다.

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


3

파이썬 3 , 62 60 56 54 바이트

ArBo에 -4 바이트

lambda s:s in(len(s)//l*s[:l]for l in range(1,len(s)))
  1. 문자열에서 가능한 모든 접두사를 반복합니다.
  2. 접두사에서 문자열을 작성하십시오.
  3. 접두사로 성공했는지 여부를 반환합니다.

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


1
좋은 대답입니다! 은 f=삭제 될 수 있습니다; 익명 기능이 일반적으로 허용됩니다. 또한 Python 2로 전환하고 any구문 대신 목록의 멤버 자격을 확인 하면 55 바이트를
ArBo

1
목록 회원, 감사합니다! 파이썬 2로 바꾸지 않겠습니다. 언어를 바꾸는 것과 같습니다. 여기서는 분명히 요점이 아닙니다.) 또한 바이트 수를 유지하면서 TIO에서 익명 함수를 테스트하는 편리한 방법이 있습니까?
movatica

1
@movatica 헤더에`f =`를 넣습니다 (\는 파이썬에서 줄 연속 문자 임)
Artemis는 Monica

짜증나게, \는 또한 이스케이프 문자입니다. 다음은 코드 형식이없는 헤더입니다. f = \
Artemis는 Monica

2

Japt , 10 바이트

true이면 양수를, false이면 0을 반환합니다. 부울 출력을 원하면 플래그를 추가하십시오.

å+ k@rXÃÊÉ

å+ k@rXÃÊÉ      Full program. Implicit input U.
                    e.g: U = "abcabcabc"
å+              Take all prefixes 
                         U = ["a","ab","abc","abca","abcab","abcabc","abcabca","abcabcab","abcabcabc"]
   k@           Filter U by:
     rXÃ        Values that return false (empty string)
                when replacing each prefix in U
                e.g: ["bcbcbc","ccc","","bcabc","cabc","abc","bc","c",""]
                                take ↑                             and ↑
                     U = ["abc","abcabcabc"]
         ÊÉ     Get U length and subtract 1. Then return the result

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


2

껍질 , 6 바이트

Ṡ€ȯhtD

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

나는 이것이 최적의 것보다 1 바이트 더 많다고 생각하지만 명시 적 구성을 ȯ불필요하게 만드는 배열을 찾을 수 없었습니다 .

설명

Ṡ€      Find the argument in the result of applying the following function to the argument
  ȯhtD  Duplicate the argument, then remove the first and last elements.

2
€htD¹을 피하십시오 ȯ.
Zgarb

환상적입니다! 나는 생각 λ€htD¹했지만 람다가 암시 적으로 추가 될 것이라는 것을 몰랐다
Sophia Lechner

2

Mathematica 11.x, 74 바이트

{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&

어디서나 #입력 문자열을 나타내고

StringCases[#,<pattern>]

패턴과 일치하는 입력 문자열의 하위 문자열을 찾습니다.

StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="") 

이 패턴은 일치가 필요 x하며 문자열의 시작 부분에서 시작해야하며 (1) 일치가 전체 입력 문자열이 아니며 (2) 입력 문자열에서 일치하는 항목을 빈 문자열로 바꾸는 조건을 충족해야합니다. 빈 문자열을 얻습니다. 마지막으로 일치하는 목록을 빈 목록과 비교하면

{}!=

이다 True일치 항목 목록이 비어 있지 않은 경우와 False일치 항목 목록이 비어있는 경우.

테스트 사례 :

{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["aa"]
(*  True  *)
{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["aaa"]
(*  True  *)
{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["abcabc"]
(*  True  *)

{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["aba"]
(*  False  *)
{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["ababa"]
(*  False  *)
{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["weqweqweqweqweqw"]
(*  False  *)

2

파이썬 3, 84 바이트

import textwrap
lambda s:any(len(set(textwrap.wrap(s,l)))<2 for l in range(1,len(s)))

반복되는 부분 문자열의 각 가능한 길이를 테스트하기 위해 문자열을 길이 조각으로 나누기 textwrap.wrap위해 ( 이 답변 덕분에) 사용합니다 n. 그런 다음 분할 조각을 세트에 추가하여 서로 비교합니다. 모든 조각이 같고 세트의 길이가 1 인 경우 문자열은 반복 문자열이어야합니다. 바이트를 절약하기 때문에 <2대신에 사용 ==1했으며 입력 문자열의 길이는 0보다 컸습니다.

n길이의 반복되는 하위 문자열이 n전체 문자열을 구성 하지 않는 경우 전체 함수에 대해 false를 반환합니다.


2

05AB1E , 5 바이트

이전 질문 의 xnor 방법05AB1E 에서도 최적 인 것으로 보입니다.

«¦¨så

온라인으로 사용해보십시오! 또는 테스트 스위트

설명

«       # append input to input
 ¦¨     # remove the first and last character of the resulting string
   så   # check if the input is in this string

1
물론 .. 거기에 아무도없는 것을 보았을 때 05AB1E 답변을하려고했습니다. 동료가 나에게 몇 가지 질문을하고 그의 휴가에 대해 이야기했습니다. 화면을 다시 한 번 봅니다. 하나의 새로운 답변입니다. 타다, 다시 XD를 이길
Kevin Cruijssen

@ KevinCruijssen : 그것은 전형적인입니다. 나에게도 여러 번 일어났다;)
Emigna

2

클린 , 73 바이트

정규식을 사용하지 않습니다.

import StdEnv,Data.List
$s=or[isPrefixOf s(cycle t)\\t<-tl(tails s)|t>[]]

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

을 정의합니다 $ :: [Char] -> Bool.
주어진 문자열이 끝에서 가져온 하위 문자열 반복의 접두사인지 확인합니다.



1

QlikView 변수, 27 바이트

변수로 정의해야합니다 $1. 그러면 입력 값과 같은 매개 변수를 전달할 수 있습니다 .

0또는 -1(QlikView의 TRUE()기능 과 동일)을 반환합니다 .

=substringcount($1&$1,$1)>2

1

스위프트, 196 바이트

func r(s:String)->Bool{guard let k=s.dropFirst().firstIndex(where:{$0==s.first}) else{return false};let v=s[...k].dropLast();var w=v;while s.hasPrefix(w) && s.count>=(w+v).count{w+=v};return s==w}

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


내가 스위프트를 사용하지 않는, 그러나 나는 확실히 여분의 공백을 제거 할 수있어
벤자민 우르크 하트

@benjamin의 제안을 사용하는 193 바이트 .
Artemis는 Monica

@ArtemisFowl 또는 123 바이트
Roman Podymov




1

T-SQL, 47 바이트

@Xnor의 방법 사용 :

DECLARE @ varchar(max)='ababab'

PRINT sign(charindex(@,left(@+@,len(@)*2-1),2))

멋진 골프 (67 바이트)가 들어 있으므로 오래된 대답을 유지하십시오.

DECLARE @y varchar(max)='abababa'

,@ INT=0WHILE
replace(@y,left(@y,@),'')>''SET
@+=1PRINT @/len(@y)^1

설명 : 이 스크립트는 '@'를 늘리면서 입력 '@y'를 입력 '@y'의 첫 번째 '@'문자로 바꾸려고 반복합니다.

'ababab'의 'ab'을 아무것도 바꾸지 않으면 빈 문자열이 있습니다.

결국 결과는 비게됩니다. 루프 변수가 varchar의 길이와 같을 때 이런 일이 발생하면 '@'= len (@y) (반복되는 varchar가 없기 때문에) 기준은 false / 0입니다.

iif(@=len(@y),0,1)

이것으로 골프를 칠 수 있습니다

@/len(@y)^1

'@y'의 길이는 0 일 수 없으며 '@'는 길이 @y를 초과하지 않기 때문입니다.

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

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