Eine Drehung "erfolgt durch Aufteilen einer Schnur in zwei Teile und Umkehren ihrer Reihenfolge" . Ein Objekt ist unter einer Operation symmetrisch, wenn das Objekt nach Anwendung dieser Operation unverändert bleibt. Eine "Rotationssymmetrie" ist also die Tatsache, dass eine Saite nach "Rotation" unverändert bleibt.
Bei einer nicht leeren Zeichenfolge, s
die nur aus Buchstaben von a
bis besteht z
, wird die höchste Ordnung der Rotationssymmetrie der Zeichenfolge ausgegeben.
Testfälle:
input output
a 1
abcd 1
abab 2
dfdfdfdfdfdf 6
Das ist Code-Golf . Die kürzeste Antwort in Bytes gewinnt. Es gelten Standardlücken .
code-golf
string
abstract-algebra
Undichte Nonne
quelle
quelle
Antworten:
Netzhaut , 15 Bytes
Probieren Sie es online aus!
Passt die gesamte Zeichenfolge an, indem eine Teilzeichenfolge wiederholt wird (kürzere Teilzeichenfolgen werden aufgrund der Unschärfe priorisiert
.+?
), und ersetzt die gesamte Zeichenfolge durch die Anzahl der von uns verwendeten Wiederholungen.quelle
.*(.+)$(?<=^(\1)*)
...Gelee , 3 Bytes
Probieren Sie es online aus!
quelle
05AB1E , 8 Bytes
Probieren Sie es online aus!
Erläuterung
quelle
Python, 31 Bytes
Suchen Sie den ersten Index ungleich Null von
s
in,s+s
um herauszufinden, wie weit wir ihn drehen müssen, ums
zurück zu gelangen , und dividieren Sie dann die Länge vons
durch diese Zahl. Basierend auf Ideen, die ich anderswo gesehen habe .quelle
Prolog (SWI) , 64 Bytes
Probieren Sie es online aus!
Definiert ein Prädikat
+/2
, dessen erstes Argument eine Zeichenfolge (in Form einer Liste von Zeichencodes) ist (A
) verwendet und sein zweites Argument (B
) auf die Reihenfolge der symmetrischen Drehung höchster Ordnung setzt.Erläuterung
Dieses Programm verwendet die Tatsache, dass die Menge der symmetrischen Rotationen auf einer Zeichenfolge eine zyklische Gruppe ist und daher die Reihenfolge der Menge der symmetrischen Rotationen gleich der Reihenfolge der symmetrischen Rotation höchster Ordnung ist. Somit kann das Programm das gewünschte Ergebnis berechnen, indem es die Gesamtzahl der symmetrischen Umdrehungen auf der Eingabezeichenfolge ermittelt.
Code Erklärung
Der Großteil des schweren Hebens erfolgt durch einen Anruf beim
findall/3
Prädikat. Dasfindall/3
Prädikat findet alle möglichen Werte für das erste Argument (X
in diesem Fall) so, dass der als zweites Argument angegebene Ausdruck wahr ist (dazu(append(X,Y,A),append(Y,X,A))
später mehr). Schließlich speichert es jeden dieser möglichen WerteX
als Liste im letzten Argument ([_|Z]
).Der Ausdruck, der
findall/3
als zweites Arugment übergeben wird,(append(X,Y,A),append(Y,X,A))
verwendet dasappend/3
Prädikat, um anzugeben, dassX
verkettet mit einigen noch nicht definierten EingabenY
gleichA
der Eingabezeichenfolge sein muss und dass dasselbeY
verkettet mit gleich seinX
mussA
. Dies bedeutet, dassX
es sich um ein Präfix handeln muss, sodass die resultierende Zeichenfolge dieselbe istA
wie, wenn sie von vorne entferntA
und hinten hinzugefügt wirdA
. Die Menge vonX
s mit dieser Eigenschaft hat fast eine Eins-zu-Eins-Entsprechung mit den symmetrischen Rotationen vonA
. Es gibt immer genau einen Fall der Doppelzählung, der durch die Tatsache verursacht wird, dass sowohl die leere Zeichenfolge alsA
auch Präfixe von sindA
das entspricht der 0-Drehung vonA
. Da die0
Drehung von .A
ist immer symmetrisch Die Länge der resultierenden Liste vonX
s ausfindall/3
ist eins größer als die Anzahl der symmetrischen UmdrehungenA
Um das Problem der Doppelzählung zu lösen, verwende ich den Mustervergleich für das dritte Argument des
findall/3
Prädikats. In Prolog werden Listen als Paare ihres Kopfes (das erste Element) und ihres Schwanzes (der Rest) dargestellt. Somit[_|Z]
stellt eine Liste, deren Schwanz gleich ist, gleich istZ
. Dies bedeutet, dass die Länge vonZ
eins weniger ist als die Anzahl der vomfindall/3
Prädikat gefundenen Präfixe und somit gleich der Anzahl der symmetrischen Umdrehungen vonA
. Schließlich benutze ich daslength/2
Prädikat, umB
die Länge von festzulegenZ
.quelle
JavaScript (ES6),
4241 Byte1 Byte dank @ l4m2 gespeichert
Testfälle
Code-Snippet anzeigen
quelle
f=s=>s.length/s.match`(.+?)\\1*$`[1].length
Japt , 7 Bytes
Testen Sie es online!
Erläuterung
quelle
PHP, 66 Bytes
Probieren Sie es online aus!
PHP, 67 Bytes
Probieren Sie es online aus!
quelle
C (gcc) , 59 Bytes
Probieren Sie es online aus!
quelle
Haskell , 49 Bytes
Probieren Sie es online aus!
Haskell , 49 Bytes
Probieren Sie es online aus!
Erläuterung
Dies verwendet die einfache Lösung @ 0 ', auf die hingewiesen wird. Da die Rotationen der Zeichenfolge eine zyklische Gruppe bilden, entspricht das Element höchster Ordnung der Größe der Gruppe. Daher können wir die Reihenfolge der Einheit ermitteln, indem wir die Anzahl der symmetrischen Rotationen ermitteln.
Der einfache Code führt ein Listenverständnis durch und zählt die Anzahl der Umdrehungen, bei denen die ursprüngliche Zeichenfolge erhalten bleibt.
quelle
drop<>take
anstelle von(++)
3 Bytes zu speichern, wie diese .(<>)
ist nicht im Auftakt, in der Version von Haskell, mit der ich arbeite.