Bei zwei Permutationen in disjunkter Zyklusform geben Sie ihr Produkt / ihre Zusammensetzung in disjunkter Zyklusform aus.
Um die Komposition zu finden, konvertieren Sie die disjunkten Zyklen in Permutationen in zweizeiliger Notation. Jede Nummer in einem disjunkten Teil eines Zyklus wird der darauf folgenden Nummer im selben Teil zugeordnet. Es wickelt sich herum. Also 1 -> 5
, 5 -> 1
, 2 -> 4
, 4 -> 2
. Wenn eine Nummer nicht gefunden wird 3 -> 3
, wird sie sich selbst zugeordnet. Der erste disjunkte Zyklus könnte auch geschrieben werden (1 5)(2 4)(3)
. Diese Zuordnungen werden wie folgt in zwei Zeilen konvertiert (beachten Sie, dass die Reihenfolge von P und Q umgekehrt ist):
Das Produkt zweier Permutationen wird erhalten, indem die Spalten der zweiten (ganz links) Permutation so angeordnet werden, dass ihre erste Reihe mit der zweiten Reihe der ersten (ganz rechts) Permutation identisch ist. Das Produkt kann dann als erste Zeile der ersten Permutation über die zweite Zeile der modifizierten zweiten Permutation geschrieben werden.
Regeln:
- Die Eingabe erfolgt als Liste von Listen oder ähnlichem Format
- Sie können nicht so etwas wie nehmen ,
(1 5)(2 4)
wie[5, 4, 3, 2, 1]
bereits in zwei Online-Formular (Mapping - Index - Wert) - Es müssen nicht alle Zahlen in jeder Gruppe vorkommen, also könnte dies der
(1 5)·(1 2)
Fall sein(2 5 1)
. - Ihre Ausgabe sollte als Eingabe verwendet werden können.
- Sie müssen die Eingabe nicht mit einem leeren Zyklus unterstützen
(1 5)·()
. Das wäre stattdessen als(1 5)·(1)
oder etwas Äquivalentes gegeben. - Da Zyklen umlaufen, spielt die Reihenfolge keine Rolle, solange das Ergebnis korrekt ist.
- Sie können bei Null oder Eins beginnen. Es spielt keine Rolle, da die Ergebnisse gleich sind.
- Die Zahlen können größer sein als
9
. - Sie dürfen dieselbe Nummer nicht mehr als einmal in die Ausgabe aufnehmen. Also
[[1],[1]]
ist nicht erlaubt. - Beachten Sie, dass diese Operation nicht kommutativ ist ! Ich habe Q vor P gesetzt, weil Wikipedia das getan hat. Sie können eine beliebige Reihenfolge wählen, aber angeben, welche, wenn es anders ist.
- Der kürzeste Code gewinnt
- Eingebaute sind zulässig, aber wenn Sie eine verwenden, zeigen Sie eine Lösung, ohne sie ebenfalls zu verwenden.
Beispiele:
Es werden nicht alle äquivalenten Ausgabemöglichkeiten angezeigt
Input
Output
[[1, 5], [2, 4]], [[1, 2, 4, 3]]
[[1, 4, 3, 5]] (or [[4, 3, 5, 1]] or ...)
[[1, 5]], [[1, 2]]
[[2, 5, 1]]
[[10, 2, 3]], [[2]]
[[3, 10, 2]]
[[1]], [[3]]
[[]] (or [[1]] or something equivalent)
[[10,2,3,15],[1,7],[5,6],[14,4,13,11,12]], [[5,6,7,9,14],[2,8,3,10],[1,11]]
[[12, 14, 6, 1], [8, 15, 10, 3, 2], [13, 11, 7, 9, 4]]
(arguments in reverse order from above gives a different answer)
[[5,6,7,9,14],[2,8,3,10],[1,11]], [[10,2,3,15],[1,7],[5,6],[14,4,13,11,12]]
[[9, 14, 4, 13, 1], [10, 8, 3, 15, 2], [7, 11, 12, 5]]
quelle
Antworten:
J , 7 Bytes
Probieren Sie es online aus!
quelle
Mathematica, 15 Bytes
Ja, Virginia, es gibt eine integrierte Funktion ... Mathematica unterstützt einen Permutationsdatentyp, der bereits in disjunkter Zyklusnotation vorliegt: Diese reine Funktion verwendet eine beliebige Anzahl von Argumenten im Formular als Eingabe
Cycles[{{1, 5}, {2, 4}}]
und gibt die Produktpermutation erneut inCycles[]
Form aus. Es verwendet die entgegengesetzte Ordnungskonvention als OP, so zum Beispielkehrt zurück
Cycles[{{1, 4, 3, 5}}]
. Das⊙
Symbol, das ich oben verwendet habe, sollte eigentlich das 3-Byte-Unicode-Symbol U + F3DE für den privaten Gebrauch sein, um in Mathematica zu arbeiten. Beachten Sie, dass Mathematica einen benannten Namen für diese Operation hatPermutationProduct
, der jedoch drei Bytes länger ist.quelle
Haskell ,
157148 BytesBEARBEITEN:
p++q
. Vertauschte Argumentreihenfolge vong
. Losgewordend
durch beginnenditerate
mitp x
, wonachtakeWhile
nicht mehr mit gebundenenfst
+span
. Hergestelltiterate
Infix.Wenn ich das mache, während ich zu spät bin ... kann ich wahrscheinlich noch mehr Golf spielen.
Es war einfacher und schien erlaubt zu sein, daher enthält die Ausgabe Einzelelementzyklen.
Probieren Sie es online aus!
Wie es funktioniert:
#
ist die Hauptfunktion.q#p
Nimmt zwei Listen mit Zahlenlisten und gibt eine ähnliche Liste zurück. Die Tests scheinen Q vor P zu haben, also habe ich die gleiche Reihenfolge verwendet.f p
wandelt die Permutationp
von der disjunkten Zyklusform in eine Funktion um, wonachf q
undf p
kann mit dem üblichen Kompositionsoperator komponiert werden.
.c
und suchta
und findet seinen Nachfolger. Wenn das Verständnis nichts findet,a
wird es einfach zurückgegeben.zip(0:c)(c++c)
ist eine Liste von Elementpaarenc
und deren Nachfolgern. Da die Frage uns "bei eins beginnen" lässt, können wir0
als Dummy-Wert verwenden; Es ist billiger, dies demzip
ersten Argument voranzustellen alstail
dem zweiten.g l p
Nimmt eine Listel
von Elementen und eine Permutationsfunktionp
und gibt die Liste der Zyklen zurück, die die Elemente berühren.c
ist der Zyklus, der das erste Elementx
der Liste enthält. Die anderen Elemente vonc
werden durch Iteration vonp x
bisx
gefunden. Wenn Sie rekursiv nach den verbleibenden Zyklen suchen, werden zunächst alle Elemente vonc
mit einem Listenverständnis entfernt.quelle
Python, 220 Bytes
quelle
Python 3.8 , 187 Bytes
Probieren Sie es online aus! oder Überprüfen Sie alle Testfälle!
Eingang :
q
undp
in dieser Reihenfolge ist jedes eine Reihe von Tupeln ausSTDIN
.Ausgabe : Die Produktpermutation
Q·P
als Satz von Tupeln, umSTDERR
.Erläuterung
Die Funktion
g
, welche Zahl der Zahli
in der Permutation zugeordnet istp
(auch bekanntg
als die inverse Permutation vonp
).Die Funktion
h
nimmt eine Zahl auf und gibt den Zyklus zurückQ·P
, der diese Zahl enthält. Der zurückgegebene Zyklus ist ein Tupel, das so formatiert ist, dass sich das kleinste Element am Index 0 befindet.Durch Anwenden
h
auf alle Zahlen können wir alle Zyklen erhaltenQ·P
. Um doppelte Zyklen in unserem Ergebnis zu vermeiden, setzen wir einfach alle Zyklen in eine Menge. Dies funktioniert, da ähnliche Zyklen, die von zurückgegebenh
werden, mit demselben Tupel formatiert werden (mit dem kleinsten Element am Index 0).Wir müssen nur die Zahlen berücksichtigen, die in
P
oder erscheinenQ
, da alle anderen Zahlen sich selbst zuordnen.quelle