Hintergrund
Die Parität einer Permutation , wie in Wikipedia definiert , ist wie folgt:
Das Vorzeichen oder die Signatur einer Permutation σ wird als sgn (σ) bezeichnet und als +1 definiert, wenn σ gerade ist, und -1, wenn σ ungerade ist.
Das Vorzeichen einer Permutation kann explizit ausgedrückt werden als
sgn (σ) = (−1) ^ N (σ)
wobei N (σ) die Anzahl der Inversionen in σ ist.
Alternativ kann das Vorzeichen einer Permutation σ aus ihrer Zerlegung in das Produkt der Transpositionen als definiert werden
sgn (σ) = (−1) ^ m
wobei m die Anzahl der Transpositionen bei der Zerlegung ist.
Für diejenigen von euch, die griechische Buchstabensuppe in ihrer Mathematik nicht mögen, werde ich versuchen, die Definition ein wenig mit einem Beispiel zu vereinfachen (auch aus Wikipedia gestohlen).
Beispiel
Betrachten wir das Eingabearray {1, 2, 3, 4, 5}
und eine Permutation davon {3, 4, 5, 2, 1}
. Um vom ursprünglichen Array zur Permutation zu gelangen, müssen Sie die Indizes 0
und 2
, 1
und 3
, dann 2
und vertauschen 4
. Obwohl dies keine eindeutige Lösung ist, ist die Parität genau definiert, sodass dies in allen Fällen funktioniert.
Da es 3 Swaps erfordert, kennzeichnen wir diese Permutation mit einer odd
Parität. Wie zu erwarten ist, hat eine Permutation, die eine gerade Anzahl von Swaps erfordert, eine even
Parität.
Herausforderung
Ihre Herausforderung besteht darin, ein Programm in möglichst wenigen Bytes zu schreiben, um die Parität einer Permutation zu bestimmen. Ihr Programm oder Ihre Funktion muss:
- Akzeptieren Sie als Argumente zwei Eingabearrays (oder Zeichenfolgen), die eine Menge vor und nach einer Permutation darstellen.
- Gibt das Zeichen
e
für gerade odero
ungerade zurück oder druckt es aus, wenn die Permutation gegeben ist. - Sollte davon ausgehen, dass alle Indizes in den Arrays oder Strings eindeutige Werte haben.
Testfälle
Angenommen, Sie haben eine Funktion mit dem Namen f
: deklariert.
f([10], [10]) == "e"
f([10, 30, 20], [30, 20, 10]) == "e"
f([10, 30, 20, 40], [30, 20, 40, 10]) == "o"
Das ist Code-Golf , das kürzeste Programm in Bytes gewinnt!
quelle
[10], [10] -> e
(keine Transpositionen).[10 30 20], [30 20 10] -> e
(zwei Transpositionen).[10 30 20 40], [30 20 40 10] -> o
(drei Transpositionen)Antworten:
Jelly,
13-12BytesProbieren Sie es online!
Wie es funktioniert
quelle
MATL ,
1716 BytesDank eines Vorschlags von Dennis wurde 1 Byte entfernt
Dies funktioniert in der aktuellen Version (15.0.0) der Sprache.
Probieren Sie es online !
Erläuterung
Dies verwendet die Definition der Parität in Bezug auf Inversionen. Eine Inversion ist ein Paar von Elementen im zweiten Array, die sich im Vergleich zum ersten Array in der "falschen" Reihenfolge befinden. Da das erste Array nicht sortiert werden muss, sortieren wir es zuerst und die gleiche Neuanordnung, die für diese Sortierung erforderlich ist, wird auf das zweite Array angewendet. Dann entspricht eine Inversion einem Elementpaar, das im zweiten Array nicht zunimmt.
Beachten Sie auch, dass die beiden Eingabearrays vertauscht werden können und das Ergebnis dasselbe ist. Es ist also nicht wichtig, welches Array als "Original" und welches als "permutiert" angesehen wird.
quelle
x(1:end-2)
usw. zu haben, ohne explizit die Größe von anzugebenx
. Ich bin mir nicht sicher, ob es eine gute Wahl war, aber ich denke, es ist zu spät, um sie jetzt zu ändern :-) Vielleicht finde ich eine kompatible Möglichkeit, eine modulare Indizierung hinzuzufügen0
hat jedoch die Bedeutung "letzter Eintrag", sodass ich ein Byte speichern kann (das Inkrement entfernen). Danke für die Idee!Oktave,
5652 BytesBisher scheint niemand diesen Ansatz zu verwenden: Grundsätzlich verwende ich nur die Determinanten der entsprechenden Permutationsmatrizen. Der Ausdruck
det(eye(nnz(a))(a,:))
gibt die Determinante der durch den Vektor definierten Permutationsmatrix zurücka
. Dann muss nur noch das richtige Zeichen aus der Zeichenfolge extrahiert werden, abhängig vom Ergebnis.quelle
Haskell, 58 Bytes
Verwendung:
Gleiche Methode wie meine Python-Antwort . stolzer haskeller hat ein byte mit gespeichert
cycle
.quelle
cycle"eo"!!...
anstatt"eo"!!mod(...)2
ein Byte zu speichern.Python 2, 68 Bytes
Verwendung:
Zählt die Anzahl der Inversionspaare von zwei gezippten Listen, d.h. Werte
(a,A)
und(b,B)
aus jeder Liste am gleichen Index mita<b
undA>B
. Diese Vergleiche werden kombinierta<b<M>A>B
, indem die Eigenschaft verwendet wird, dass die ListeM
größer als eine beliebige Zahl ist. Die Summe wird dann modulo 2 genommen und ine
oder umgewandelto
.quelle
JavaScript (ES6), 73 Byte
Da wir nur an der Parität interessiert sind, werden doppelte Transpositionen einfach aufgehoben. Bequemerweise sind die Array-Indizes von JavaScript nicht mehrdimensional.
quelle
Mathematica, 77 Bytes
Genau!
quelle
Cycles
. Es erhöht die Größe desPermutationCycles
Namens und ist sogarPermutationCycles
dumm, einCycles
Objekt zurückzugeben! `Mathematica, 31 Bytes
Wir können eine Liste in die andere umordnen, indem wir zuerst eine Liste in eine beliebige Reihenfolge (in diesem Fall die kanonische Reihenfolge) umordnen und diese Liste in die endgültige Liste umordnen. Das Vorzeichen der Gesamtpermutation ist gerade, wenn die Vorzeichen der beiden Unterpermutationen gleich sind.
quelle