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 .

Undichte Nonne
quelle
Verbunden.
Martin Ender
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.

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

Gelee , 3 Bytes

ṙJċ

Probieren Sie es online aus!

Erik der Outgolfer
quelle
Herzliche Glückwünsche!
Undichte Nonne
@LeakyNun Das war deine Lösung, oder?
Erik der Outgolfer
In der Tat war es.
Undichte Nonne
Ist Ihr Name eine Gauntlet-Referenz?
user2357112 unterstützt Monica
@ user2357112 Nein, es bezieht sich auf Outgolfing, dh wenn Sie eine Lösung veröffentlichen, die kürzer als eine andere veröffentlichte Lösung ist.
Erik der Outgolfer
3

05AB1E , 8 Bytes

gGDÀ})QO

Probieren Sie es online aus!

Erläuterung

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

user2357112 unterstützt Monica
quelle
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.

0 '
quelle
2

JavaScript (ES6), 42 41 Byte

1 Byte dank @ l4m2 gespeichert

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

Testfälle

Arnauld
quelle
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
ETH-Produktionen
quelle
0

C (gcc) , 59 Bytes

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

n;

Probieren Sie es online aus!

14 m2
quelle
tio sollte vorgeschlagen werden, damit entschieden werden kann, ob die Complier-Flags zur Codelänge hinzugefügt werden
l4m2
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.

Ad-hoc-Garf-Jäger
quelle
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