Contexte
La parité d'une permutation , telle que définie par wikipedia , est la suivante:
Le signe ou la signature d'une permutation σ est noté sgn (σ) et défini comme +1 si σ est pair et -1 si σ est impair.
Le signe d'une permutation peut être explicitement exprimé comme
sgn (σ) = (−1) ^ N (σ)
où N (σ) est le nombre d'inversions dans σ.
Alternativement, le signe d'une permutation σ peut être défini à partir de sa décomposition en produit de transpositions comme
sgn (σ) = (−1) ^ m
où m est le nombre de transpositions dans la décomposition.
Pour ceux d'entre vous qui n'aiment pas la soupe à l'alphabet grec dans leurs mathématiques, je vais essayer de simplifier un peu la définition avec un exemple (également volé sur wikipedia).
Exemple
Considérons le tableau d'entrée {1, 2, 3, 4, 5}
, et une permutation de celui - ci, disons, {3, 4, 5, 2, 1}
. Pour passer du tableau d'origine à sa permutation, vous devez permuter les indices 0
et 2
, 1
et 3
, puis 2
et 4
. Bien que ce ne soit pas une solution unique, la parité est bien définie, donc cela fonctionne pour tous les cas.
Puisqu'elle nécessite 3 swaps, nous étiquetons cette permutation avec une odd
parité. Comme vous pouvez vous y attendre, une permutation qui nécessite une quantité égale de swaps est réputée avoir une even
parité.
Défi
Votre défi est d'écrire un programme en aussi peu d'octets que possible pour déterminer la parité d'une permutation. Votre programme ou fonction doit:
- Acceptez comme arguments, deux tableaux (ou chaînes) d'entrée représentant un ensemble avant et après une permutation.
- Retourne ou imprime le caractère
e
pair ouo
impair, compte tenu de la permutation. - Devrait supposer que tous les indices des tableaux ou des chaînes ont des valeurs uniques.
Cas de test
En supposant que vous ayez déclaré une fonction nommée f
:
f([10], [10]) == "e"
f([10, 30, 20], [30, 20, 10]) == "e"
f([10, 30, 20, 40], [30, 20, 40, 10]) == "o"
C'est le code-golf , le programme le plus court en octets gagne!
[10], [10] -> e
(zéro transpositions). [10 30 20], [30 20 10] -> e
(deux transpositions). [10 30 20 40], [30 20 40 10] -> o
(trois transpositions)