DIE AUFGABE
DEFINITIONEN
Betrachten Sie die Punkte {1,2,3,4,5} und alle ihre Permutationen. Wir können die Gesamtzahl der möglichen Permutationen dieser 5 Punkte durch einen einfachen Trick ermitteln: Stellen Sie sich vor, Sie füllen 5 Slots mit diesen Punkten, der erste Slot hat 5 mögliche Nummern, der zweite 4 (wie einer verwendet wurde, um den ersten Slot zu füllen). die dritte 3 und so weiter. Somit beträgt die Gesamtzahl der Permutationen 5 * 4 * 3 * 2 * 1; das wäre 5! Permutationen oder 120 Permutationen. Wir können uns dies als die symmetrische Gruppe S5 vorstellen, und dann hätte die symmetrische Gruppe Sn n! or (n*n-1*n-2...*1)
Permutationen.
Eine "gerade" Permutation ist eine, bei der es eine gerade Anzahl von Zyklen mit gerader Länge gibt. Es ist am einfachsten zu verstehen, wenn es in zyklischer Notation geschrieben ist, zum Beispiel (1 2 3)(4 5)
permutiert 1->2->3->1
und 4->5->4
einen 3-Längen-Zyklus (1 2 3)
und einen 2-Längen-Zyklus hat (4 5)
. Wenn wir eine Permutation als ungerade oder gerade klassifizieren, ignorieren wir ungerade Längenzyklen und sagen, dass diese Permutation [ (1 2 3)(4 5)
] ungerade ist, da sie eine ungerade Anzahl {1} von geraden Längenzyklen hat. Sogar Beispiele:
(1)(2 3)(4 5)
= zwei 2 Längenzyklen | AUCH |(1 2 3 4 5)
= keine geraden Längenzyklen | AUCH | * Beachten Sie, dass die Permutation gerade ist, wenn keine Zyklen mit gerader Länge vorhanden sind.
Seltsame Beispiele:
(1 2)(3 4 5)
= ein Zyklus mit 2 Längen | ODD |(1)(2 3 4 5)
= ein Zyklus mit 4 Längen | ODD |
Da genau die Hälfte der Permutationen in einer symmetrischen Gruppe gerade sind, können wir die gerade Gruppe als alternierende Gruppe N bezeichnen, also als S5 = 120 A5 = 60 Permutationen.
NOTATION
Zumindest dafür sollten Permutationen in zyklischer Notation geschrieben werden, wobei jeder Zyklus in einer anderen Klammer steht und jeder Zyklus in aufsteigender Reihenfolge abläuft. Zum Beispiel (1 2 3 4 5)
nicht (3 4 5 1 2)
. Und für Zyklen mit einer einzelnen Zahl, wie zum Beispiel: (1)(2 3 4)(5)
Die einzelnen / festen Punkte können ausgeschlossen werden (1)(2 3 4)(5) = (2 3 4)
. Aber die Identität (der Punkt, an dem alle Punkte festgelegt sind (1)(2)(3)(4)(5)
) sollte nur geschrieben werden ()
, um sie darzustellen.
DIE HERAUSFORDERUNG
Ich möchte, dass Sie in so wenig Code wie möglich eine positive ganze Zahl als Eingabe {1,2,3,4 ...} nehmen und alle Permutationen der alternierenden Gruppe An anzeigen, wobei n die Eingabe / alle Geraden ist Permutationen von Sn. Beispielsweise:
Input = 3
()
(1 2 3)
(1 3 2)
und
Input = 4
()
(1 2)(3 4)
(1 3)(2 4)
(1 4)(2 3)
(1 2 3)
(1 3 2)
(1 2 4)
(1 4 2)
(1 3 4)
(1 4 3)
(2 3 4)
(2 4 3)
Und wie in den Beispielen möchte ich, dass alle Zyklen einer Länge entfernt werden, und was die Identität betrifft: Ausgaben von nichts,
()
{nicht nur Klammern, sondern mit allem, was Sie verwenden, um unterschiedliche Permutationen anzuzeigen} oder id
akzeptabel sind.
ZUSÄTZLICHE LESUNG
Weitere Informationen finden Sie hier:
VIEL GLÜCK
Und da dies ein Codegolf ist, gewinnt jeder, der die Permutationen der alternierenden Gruppe An in kürzesten Bytes drucken kann.
quelle
[[1, 2], [3, 4]]
statt ausgegeben werden(1 2)(3 4)
?(2 3 1 4)
in aufsteigender Reihenfolge? Meinen Sie damit, wir sollten nur das kleinste Element in den Vordergrund stellen?(2 3 1 4)
nicht2->3->1->4->2
kann geschrieben werden ,(1 4 2 3)
zuerst mit seinem kleinsten ElementeAntworten:
Pyth, 26 Bytes
Probieren Sie es online aus
Diese Lösung basiert auf einer sauberen Bijektion zwischen Permutationen in Einzeilennotation und Permutationen in Zyklusnotation. Natürlich gibt es die offensichtliche Bijektion, bei der die beiden Notationen dieselbe Permutation darstellen:
[8, 4, 6, 3, 10, 1, 5, 9, 2, 7] = (1 8 9 2 4 3 6) (5 10 7)
aber das würde zu viel Code erfordern. Zerhacken Sie stattdessen einfach die einzeilige Notation vor allen Zahlen, die kleiner als alle ihre Vorgänger sind, in Teile, rufen Sie diese Teilzyklen auf und erstellen Sie daraus eine neue Permutation.
[8, 4, 6, 3, 10, 1, 5, 9, 2, 7] 8 (8) (4 6) (3 10) (1 5 9 2 7)
Um diese Bijektion umzukehren, können wir jede Permutation in Zyklusform nehmen, jeden Zyklus so drehen, dass seine kleinste Zahl an erster Stelle steht, die Zyklen so sortieren, dass ihre kleinsten Zahlen in absteigender Reihenfolge erscheinen, und alle Klammern löschen.
quelle
id
. Vielleicht könnte er mitmachen?Mathematica,
844931 BytesZusammensetzung zweier Funktionen. Ausgänge in Form
{Cycles[{}], Cycles[{{a, b}}], Cycles[{{c, d}, {e, f}}], ...}
darstellt(), (a b), (c d)(e f), ...
.quelle
J , 53 Bytes
Die Zyklen in jeder Permutation werden als Box-Arrays dargestellt, da J zerlumpte Arrays mit Null-Pad auffüllt.
Wenn die Ausgabe entspannt ist, verwenden Sie 41 Bytes
wobei jede Permutation Ein-Zyklen und Null-Zyklen enthalten kann.
Verwendungszweck
Für die alternative Implementierung
quelle
Gelee ,
3428 BytesProbieren Sie es hier aus .
Erläuterung
Jede Zeile in einem Jelly-Programm definiert eine Funktion. Das unterste ist "
main
".Die erste Zeile definiert eine Funktion, die prüft, ob ein Zyklusprodukt ungerade ist.
Die zweite Zeile normalisiert eine Partition einer Permutation
[1…n]
in ein Zyklusprodukt wie folgt:Dies wird zB
(4 3)(2 5 1)
in(1 2 5)(3 4)
.Hier ist das Hauptprogramm. Es nimmt ein Argument
n
von der Kommandozeile und:quelle
JavaScript (Firefox 30-57),
220218212211 ByteLeider reichen 88 Bytes nur aus, um die alternierende Gruppe als Liste von Permutationen von zu generieren. Die Konvertierung der Ausgabe in das gewünschte Format
a
kostet mich dann zusätzlich132130124123 Bytes:Ich habe es geschafft, meine ES6-Version auf
222216215 Bytes zu reduzieren:quelle
(1,2,3)(4,5)
- das ist eine seltsame Permutation! Momentan würde ich zB zeigen, dass(1,2,3)(4)(5)
das Entfernen von Zyklen der Länge 1 nicht nur 6 Bytes kostet, sondern auch ein leeres Ergebnis für den Identitätszyklus ergibt, dessen Korrektur weitere 4 Bytes kosten würde.as for the identity outputs of nothing ... are accepatble
. Und was würde auch angezeigt, wenn Sie Ihre "Rohdaten" ausgeben, kommt es in der Form (1,2,3) (4) (5) oder als etwas anderes?[1, 2, 0, 3, 4]
für dieses spezielle Beispiel bestimmt, also bei weitem nicht das, was Sie wollen.GAP , 32 Bytes
Vielen Dank an @ChristianSievers für die Halbierung der Anzahl.
Verwendung an der Eingabeaufforderung:
quelle
f:=n->List(AlternatingGroup(n));