Rotacyjna symetria sznurka

9

Obrót „polega na podzieleniu sznurka na dwie części i odwróceniu ich kolejności” . Obiekt jest symetryczny pod operacją, jeśli obiekt pozostaje niezmieniony po zastosowaniu tej operacji. Tak więc „symetria obrotowa” polega na tym, że łańcuch „pozostaje niezmieniony po„ rotacji ”.

Biorąc pod uwagę niepusty ciąg sskładający się tylko z liter od ado z, wypisuje najwyższy rząd symetrii obrotowej ciągu.

Przypadki testowe:

input        output
a            1
abcd         1
abab         2
dfdfdfdfdfdf 6

To jest . Najkrótsza odpowiedź w bajtach wygrywa. Obowiązują standardowe luki .

Leaky Nun
źródło
Związane z.
Martin Ender
1
wcześniej zapytany jako CMC: chat.stackexchange.com/transcript/message/37509699#37509699
John Dvorak
Jest to to samo, co znalezienie liczby symetrycznych obrotów mniejszych niż rozmiar struny. Jak wskazuje @ 0 ', tworzą one grupę cykliczną, więc znalezienie najwyższego rzędu jest takie samo jak znalezienie wielkości grupy. Dzięki temu wyjaśnienie zadania, które jest obecnie dość niejasne, jest znacznie jaśniejsze.
Ad Hoc Garf Hunter

Odpowiedzi:

8

Siatkówka , 15 bajtów

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

Wypróbuj online!

Dopasowuje cały ciąg, powtarzając podłańcuch (krótsze podciągi są traktowane priorytetowo ze względu na niestosowanie .+?) i zastępuje cały ciąg podaną liczbą powtórzeń.

Martin Ender
źródło
Och, oczywiście, niewdzięczność. A ja walczyłem z .*(.+)$(?<=^(\1)*)...
Neil
5

Galaretka , 3 bajty

ṙJċ

Wypróbuj online!

Erik the Outgolfer
źródło
Gratulacje!
Leaky Nun
@LeakyNun To było twoje rozwiązanie, prawda?
Erik the Outgolfer
Rzeczywiście tak było.
Leaky Nun
Czy twoje imię to odniesienie do rękawicy?
user2357112 obsługuje Monikę
@ user2357112 Nie, odnosi się to do gry w golfa, tj. gdy opublikujesz rozwiązanie krótsze niż inne opublikowane rozwiązanie.
Erik the Outgolfer
3

05AB1E , 8 bajtów

gGDÀ})QO

Wypróbuj online!

Wyjaśnienie

gG  }      # len(input)-1 times do:
  D        # duplicate
   À       # rotate left
     )     # wrap result in a list
      Q    # compare each to input for equality
       O   # sum
Emigna
źródło
2

Python, 31 bajtów

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

Znajdź pierwszy niezerowy indeks sin, s+saby dowiedzieć się, jak daleko musimy go obrócić, aby swrócić, a następnie podziel długość sprzez tę liczbę. Na podstawie pomysłów, które widziałem gdzie indziej .

user2357112 obsługuje Monikę
źródło
2

Prolog (SWI) , 64 bajty

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

Wypróbuj online!

Definiuje predykat, +/2który jako pierwszy argument przyjmuje ciąg (w postaci listy kodów znaków A) i ustawia drugi argument (B ) na kolejności symetrycznej rotacji najwyższego rzędu.

Wyjaśnienie

Ten program wykorzystuje fakt, że zbiór symetrycznych obrotów na sznurku jest grupą cykliczną, a zatem rząd zbioru symetrycznych rotacji jest równy rzędowi symetrycznego obrotu najwyższego rzędu. W ten sposób program jest w stanie obliczyć pożądany wynik, znajdując całkowitą liczbę symetrycznych obrotów na ciągu wejściowym.

Objaśnienie kodu

Większość ciężkich operacji podnoszenia odbywa się przez wezwanie do findall/3orzeczenia. findall/3Orzeczenie wyszukuje wszystkie inne możliwe wartości pierwszego argumentu ( Xw tym przypadku) w taki sposób, że ekspresja podano jako drugi argument jest prawdą ( (append(X,Y,A),append(Y,X,A))bardziej na później). Na koniec przechowuje każdą z tych możliwych wartości Xjako listę w końcowym argumencie ( [_|Z]).

Wyrażenie przekazane findall/3jako drugi argument (append(X,Y,A),append(Y,X,A))używa append/3predykatu do określenia, że Xkonkatenacja z niektórymi jeszcze niezdefiniowanymi Ymusi być równa Ałańcuchowi wejściowemu i że to samo Ykonkatenowane z Xmusi również być równe A. Oznacza to, że Xmusi to być jakiś prefiks, Atak że jeśli zostanie usunięty z przodu Ai dodany z tyłu, powstały ciąg będzie taki sam jak A. Zbiór Xs o tej właściwości ma prawie jeden do jednego związek z symetrycznymi obrotami A. Zawsze występuje dokładnie jeden przypadek podwójnego liczenia, który jest spowodowany faktem, że zarówno pusty ciąg znaków, jak i AprzedrostkiAktóre odpowiadają obrotowi 0 z A. Ponieważ 0obrót Ajest zawsze symetryczny, długość wynikowej listy Xs od findall/3będzie o jeden większa niż liczba symetrycznych obrotów na A.

Aby rozwiązać problem podwójnego liczenia, używam dopasowania wzorca do trzeciego argumentu findall/3predykatu. W listach prologów są reprezentowane jako pary głowy (pierwszy element) i ogona (reszta). Zatem [_|Z]reprezentuje listę, której ogon jest równy, jest równy Z. Oznacza to, że długość Zjest o jeden mniejsza niż liczba przedrostków znalezionych w findall/3predykacie, a zatem równa liczbie obrotów symetrycznych A. Na koniec używam length/2predykatu, aby ustawić Bdługość Z.

0 '
źródło
2

JavaScript (ES6), 42 41 bajtów

Zapisano 1 bajt dzięki @ l4m2

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

Przypadki testowe

Arnauld
źródło
f=s=>s.length/s.match`(.+?)\\1*$`[1].length
l4m2
1

Japt , 7 bajtów

¬x@¥UéY

Przetestuj online!

Wyjaśnienie

 ¬ 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
ETHprodukcje
źródło
0

PHP, 66 bajtów

for(;strtr($a=$argn,[substr($a,0,++$i)=>""]););echo strlen($a)/$i;

Wypróbuj online!

PHP, 67 bajtów

preg_match('#^(.+?)\1*$#',$argn,$t);echo substr_count($argn,$t[1]);

Wypróbuj online!

Jörg Hülsermann
źródło
0

C (gcc) , 59 bajtów

-Df(d,s)=for(d=n=strlen(s);n%d|memcmp(s,s+n/d,n-n/d);d--)

n;

Wypróbuj online!

l4m2
źródło
Należy zasugerować tio, aby można było zdecydować o dodaniu flag
zgodności
0

Haskell , 49 bajtów

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

Wypróbuj online!

Haskell , 49 bajtów

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

Wypróbuj online!

Wyjaśnienie

Wykorzystuje to wskazane proste rozwiązanie @ 0 '. Ponieważ obroty struny tworzą grupę cykliczną, element najwyższego rzędu jest taki sam jak rozmiar grupy, dlatego możemy uzyskać porządek jednostki, znajdując liczbę obrotów symetrycznych.

Proste kody analizują listę i zliczają liczbę obrotów, które zachowują oryginalny ciąg.

Ad Hoc Garf Hunter
źródło
Możesz użyć drop<>takezamiast używać (++)do zapisania 3 bajtów, tak jak to .
ბიმო
@BMO (<>)nie jest w wersji wstępnej , w wersji Haskell, z którą współpracuję.
Ad Hoc Garf Hunter