줄의 회전 대칭


9

회전은 "줄을 두 조각으로 나누고 순서를 반대로하여 이루어진다 " . 상기 동작을 적용한 후에 물체가 변하지 않으면 동작 하에서 물체는 대칭이다. 따라서 "회전 대칭"은 "회전"후에 문자열이 변경되지 않은 상태입니다.

sfrom a~ 문자만으로 구성된 비어 있지 않은 문자열 z이 제공되면 문자열의 회전 대칭 순서가 가장 높은 순서로 출력됩니다.

테스트 케이스 :

input        output
a            1
abcd         1
abab         2
dfdfdfdfdfdf 6

이것은 . 바이트 단위의 최단 답변이 이깁니다. 표준 허점이 적용됩니다.




이것은 스트링 크기보다 작은 대칭 회전 수를 찾는 것과 같습니다. @ 0 '이 지적한 것처럼 그들은 순환 그룹을 형성하므로 가장 높은 차수를 찾는 것은 그룹의 크기를 찾는 것과 같습니다. 이것은 현재 명확하지 않은 작업에 대한 설명을 명확하게합니다.
Ad Hoc Garf Hunter 17

답변:


8

망막 , 15 바이트

(^.+?|\1)+$
$#1

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

하위 문자열을 반복하여 전체 문자열을 일치시키고 (ungreedy로 인해 짧은 하위 문자열이 우선 순위를 지정 함 .+?) 전체 문자열을 사용한 반복 횟수로 바꿉니다.


물론, 욕심이 있습니다. 그리고 여기에 어려움을 겪고있었습니다 .*(.+)$(?<=^(\1)*)...
Neil



2

파이썬, 31 바이트

lambda s:len(s)/(s+s).find(s,1)

되돌아 가기 위해 얼마나 멀리 회전해야하는지 알아 내기 위해 sin 이 아닌 첫 번째 인덱스를 찾은 다음 길이를 해당 숫자 로 나눕니다 . 다른 곳에서 본 아이디어를 기반으로 합니다.s+sss


2

프롤로그 (SWI) , 64 바이트

A+B:-findall(X,(append(X,Y,A),append(Y,X,A)),[_|Z]),length(Z,B).

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

술어 정의 +/2첫번째 인수로 (문자 코드의리스트의 형태로) 문자열을 얻어 ( A)과 두번째 인수 (설정 B최상위 대칭 회전의 순서로 참조).

설명

이 프로그램은 문자열의 대칭 회전 집합이 순환 그룹이므로 대칭 회전 집합의 순서가 최상위 대칭 회전의 순서와 동일하다는 사실을 사용합니다. 따라서 프로그램은 입력 문자열에서 총 대칭 회전 수를 찾아 원하는 결과를 계산할 수 있습니다.

코드 설명

무거운 리프팅의 대부분은 findall/3술어를 호출하여 수행됩니다 . findall/3술어 (첫번째 인수에 대한 모든 다른 가능한 값 발견 X번째 인수로 주어진 식 (사실임이 경우) 등 (append(X,Y,A),append(Y,X,A))나중에 그 온). 마지막으로 가능한 모든 값을 X최종 인수 ( [_|Z]) 의 목록으로 저장합니다 .

findall/3두 번째 arugment로 전달 된 표현식 (append(X,Y,A),append(Y,X,A))append/3술어를 사용하여 X아직 정의되지 않은 일부와 연결된 것은 입력 문자열 Y과 같아야하며 A, Y연결된 것과 동일한 X것은 같아야 함을 지정 A합니다. 이것은 X접두사가 A앞에 와서 제거되고 A뒤에 추가되는 경우 결과 문자열이와 같아야 한다는 접두사 여야합니다 A. X이 속성을 가진 의 세트는 의 회전에 대칭 회전과 거의 일대일 대응 관계를 갖습니다A . 빈 문자열과 A접두사 라는 사실로 인해 이중 계산의 경우는 항상 정확히 하나 입니다.A의 0 회전에 해당합니다 A. 이후 0의 회전이 A의 결과 목록의 대칭 길이 항상 X들에서 findall/3의 대칭 회전 수에 1을 더한 것입니다 A.

이중 계산 문제를 해결하기 위해 findall/3조건 자의 세 번째 인수에 패턴 일치를 사용합니다 . 프롤로그에서 목록은 머리 (첫 번째 요소)와 꼬리 (나머지)의 쌍으로 표시됩니다. 따라서 [_|Z]꼬리가 같은 목록을 나타냅니다 Z. 이는 길이 Zfindall/3술어 에서 찾은 접두사 수보다 1이 작으므로 대칭 회전 수와 같습니다 A. 마지막으로 length/2조건자를 사용 B하여 길이 를 설정 합니다 Z.


2

자바 스크립트 (ES6), 42 41 바이트

@ l4m2 덕분에 1 바이트 절약

s=>s.length/s.match`(.+?)\\1*$`[1].length

테스트 사례


f=s=>s.length/s.match`(.+?)\\1*$`[1].length
l4m2

1

Japt , 7 바이트

¬x@¥UéY

온라인으로 테스트하십시오!

설명

 ¬ x@   ¥ UéY
 q xXY{ ==UéY}  // Expanded
Uq xXY{U==UéY}  // Variable introduction
                // Implicit: U = input string
Uq              // Split U into chars.
   xXY{      }  // Map each item X and index Y by this function, then sum the results:
       U==UéY   //   Return U equals (U rotated by Y characters).
                // Implicit: output result of last expression



0

하스켈 , 49 바이트

g x=sum[1|a<-[1..length x],drop a x++take a x==x]

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

하스켈 , 49 바이트

g x=sum[1|(a,_)<-zip[1..]x,drop a x++take a x==x]

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

설명

이것은 간단한 해결책 @ 0 '이 지적한 것입니다. 스트링의 회전이 순환 그룹을 형성하기 때문에 최상위 요소는 그룹의 크기와 동일하므로 대칭 회전 수를 찾아 단위의 순서를 얻을 수 있습니다.

간단한 코드는 목록 이해를 수행하고 원래 문자열을 유지하는 회전 수를 계산합니다.


당신은 사용할 수 있습니다 drop<>take사용하는 대신 (++)같은 3 바이트를 저장 .
ბიმო

@BMO (<>)는 Haskell 버전에서 작업 중이 아닙니다.
Ad Hoc Garf Hunter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.