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 s
składający się tylko z liter od a
do z
, wypisuje najwyższy rząd symetrii obrotowej ciągu.
Przypadki testowe:
input output
a 1
abcd 1
abab 2
dfdfdfdfdfdf 6
To jest golf-golf. Najkrótsza odpowiedź w bajtach wygrywa. Obowiązują standardowe luki .
code-golf
string
abstract-algebra
Leaky Nun
źródło
źródło
Odpowiedzi:
Siatkówka , 15 bajtów
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ń.źródło
.*(.+)$(?<=^(\1)*)
...Galaretka , 3 bajty
Wypróbuj online!
źródło
05AB1E , 8 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Python, 31 bajtów
Znajdź pierwszy niezerowy indeks
s
in,s+s
aby dowiedzieć się, jak daleko musimy go obrócić, abys
wrócić, a następnie podziel długośćs
przez tę liczbę. Na podstawie pomysłów, które widziałem gdzie indziej .źródło
Prolog (SWI) , 64 bajty
Wypróbuj online!
Definiuje predykat,
+/2
który jako pierwszy argument przyjmuje ciąg (w postaci listy kodów znakówA
) 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/3
orzeczenia.findall/3
Orzeczenie wyszukuje wszystkie inne możliwe wartości pierwszego argumentu (X
w 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ściX
jako listę w końcowym argumencie ([_|Z]
).Wyrażenie przekazane
findall/3
jako drugi argument(append(X,Y,A),append(Y,X,A))
używaappend/3
predykatu do określenia, żeX
konkatenacja z niektórymi jeszcze niezdefiniowanymiY
musi być równaA
łańcuchowi wejściowemu i że to samoY
konkatenowane zX
musi również być równeA
. Oznacza to, żeX
musi to być jakiś prefiks,A
tak że jeśli zostanie usunięty z przoduA
i dodany z tyłu, powstały ciąg będzie taki sam jakA
. ZbiórX
s o tej właściwości ma prawie jeden do jednego związek z symetrycznymi obrotamiA
. Zawsze występuje dokładnie jeden przypadek podwójnego liczenia, który jest spowodowany faktem, że zarówno pusty ciąg znaków, jak iA
przedrostkiA
które odpowiadają obrotowi 0 zA
. Ponieważ0
obrótA
jest zawsze symetryczny, długość wynikowej listyX
s odfindall/3
będzie o jeden większa niż liczba symetrycznych obrotów naA
.Aby rozwiązać problem podwójnego liczenia, używam dopasowania wzorca do trzeciego argumentu
findall/3
predykatu. 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ównyZ
. Oznacza to, że długośćZ
jest o jeden mniejsza niż liczba przedrostków znalezionych wfindall/3
predykacie, a zatem równa liczbie obrotów symetrycznychA
. Na koniec używamlength/2
predykatu, aby ustawićB
długośćZ
.źródło
JavaScript (ES6),
4241 bajtówZapisano 1 bajt dzięki @ l4m2
Przypadki testowe
Pokaż fragment kodu
źródło
f=s=>s.length/s.match`(.+?)\\1*$`[1].length
Japt , 7 bajtów
Przetestuj online!
Wyjaśnienie
źródło
PHP, 66 bajtów
Wypróbuj online!
PHP, 67 bajtów
Wypróbuj online!
źródło
C (gcc) , 59 bajtów
Wypróbuj online!
źródło
Haskell , 49 bajtów
Wypróbuj online!
Haskell , 49 bajtów
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.
źródło
drop<>take
zamiast używać(++)
do zapisania 3 bajtów, tak jak to .(<>)
nie jest w wersji wstępnej , w wersji Haskell, z którą współpracuję.