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 .




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ń.


Och, oczywiście, niewdzięczność. A ja walczyłem z .*(.+)$(?<=^(\1)*)...
Neil


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


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.


2

JavaScript (ES6), 42 41 bajtów

Zapisano 1 bajt dzięki @ l4m2

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

Przypadki testowe


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



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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.