Rotationssymmetrie der Saite


9

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, sdie nur aus Buchstaben von abis 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 . Die kürzeste Antwort in Bytes gewinnt. Es gelten Standardlücken .




Dies entspricht dem Ermitteln der Anzahl der symmetrischen Umdrehungen, die kleiner als die Größe der Zeichenfolge sind. Wie @ 0 'hervorhebt, bilden sie eine zyklische Gruppe. Das Finden der höchsten Ordnung entspricht dem Finden der Größe der Gruppe. Dies würde die Erklärung der Aufgabe, die derzeit ziemlich unklar ist, viel klarer machen.
Ad-hoc-Garf-Jäger

Antworten:


8

Netzhaut , 15 Bytes

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

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.


Oh, natürlich, unhöflich. Und hier hatte ich Probleme mit .*(.+)$(?<=^(\1)*)...
Neil



2

Python, 31 Bytes

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

Suchen Sie den ersten Index ungleich Null von sin, s+sum herauszufinden, wie weit wir ihn drehen müssen, um szurück zu gelangen , und dividieren Sie dann die Länge von sdurch diese Zahl. Basierend auf Ideen, die ich anderswo gesehen habe .


2

Prolog (SWI) , 64 Bytes

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

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/3Prädikat. Das findall/3Prädikat findet alle möglichen Werte für das erste Argument ( Xin 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 Werte Xals Liste im letzten Argument ( [_|Z]).

Der Ausdruck, der findall/3als zweites Arugment übergeben wird, (append(X,Y,A),append(Y,X,A))verwendet das append/3Prädikat, um anzugeben, dass Xverkettet mit einigen noch nicht definierten Eingaben Ygleich Ader Eingabezeichenfolge sein muss und dass dasselbe Yverkettet mit gleich sein Xmuss A. Dies bedeutet, dass Xes sich um ein Präfix handeln muss, sodass die resultierende Zeichenfolge dieselbe ist Awie, wenn sie von vorne entfernt Aund hinten hinzugefügt wird A. Die Menge von Xs mit dieser Eigenschaft hat fast eine Eins-zu-Eins-Entsprechung mit den symmetrischen Rotationen von A. Es gibt immer genau einen Fall der Doppelzählung, der durch die Tatsache verursacht wird, dass sowohl die leere Zeichenfolge als Aauch Präfixe von sindAdas entspricht der 0-Drehung von A. Da die 0Drehung von .Aist immer symmetrisch Die Länge der resultierenden Liste von Xs aus findall/3ist 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/3Prä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 ist Z. Dies bedeutet, dass die Länge von Zeins weniger ist als die Anzahl der vom findall/3Prädikat gefundenen Präfixe und somit gleich der Anzahl der symmetrischen Umdrehungen von A. Schließlich benutze ich das length/2Prädikat, um Bdie Länge von festzulegen Z.


2

JavaScript (ES6), 42 41 Byte

1 Byte dank @ l4m2 gespeichert

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

Testfälle


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

1

Japt , 7 Bytes

¬x@¥UéY

Testen Sie es online!

Erläuterung

 ¬ 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 Bytes

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

Probieren Sie es online aus!

Haskell , 49 Bytes

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

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.


Sie können verwendet werden drop<>takeanstelle von (++)3 Bytes zu speichern, wie diese .
28.

@BMO (<>)ist nicht im Auftakt, in der Version von Haskell, mit der ich arbeite.
Ad-hoc-Garf-Jäger
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.