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!
la source
[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)Réponses:
Gelée,
1312 octetsEssayez-le en ligne!
Comment ça fonctionne
la source
MATL ,
1716 octets1 octet supprimé grâce à une suggestion de Dennis
Cela fonctionne en la version actuelle (15.0.0) de la langue.
Essayez-le en ligne !
Explication
Celui-ci utilise la définition de la parité en termes d'inversions. Une inversion est une paire d'éléments du deuxième tableau qui sont dans le "mauvais" ordre par rapport au premier tableau. Puisque le premier tableau n'a pas besoin d'être trié, nous le trions d'abord et le même réarrangement nécessaire pour ce tri est appliqué au second tableau. Ensuite, une inversion correspond à une paire d'éléments qui n'augmente pas dans le deuxième tableau.
Notez également que les deux tableaux d'entrée peuvent être échangés et le résultat est le même. Il n'est donc pas important de savoir quel tableau est considéré comme "original" et lequel est "permuté".
la source
x(1:end-2)
etc sans indiquer explicitement la taille dex
. Je ne sais pas si c'était un bon choix, mais je suppose qu'il est trop tard pour changer maintenant :-) Peut-être que je trouverai un moyen compatible pour ajouter une indexation modulaire0
a la signification de "dernière entrée", donc je peux enregistrer un octet (supprimer l'incrément). Merci pour l'idée!Octave,
5652 octetsIl semble que personne n'utilise cette approche jusqu'à présent: en gros, j'utilise simplement les déterminants des matrices de permutation correspondantes. L'expression
det(eye(nnz(a))(a,:))
renvoie le déterminant de la matrice de permutation définie par le vecteura
. Ensuite, il suffit d'extraire le bon caractère de la chaîne, selon le résultat.la source
Haskell, 58 octets
Usage:
Même méthode que ma réponse Python . fier haskeller a enregistré un octet avec
cycle
.la source
cycle"eo"!!...
lieu de"eo"!!mod(...)2
, enregistrer un octet.Python 2, 68 octets
Usage:
Compte le nombre de paires d'inversion de deux listes zippées, i, e. valeurs
(a,A)
et(b,B)
de chaque liste au même index aveca<b
etA>B
. Ces comparaisons sont combinées ena<b<M>A>B
utilisant la propriété que la listeM
est supérieure à n'importe quel nombre. La somme est alors prise modulo 2 et transformée ene
ouo
.la source
JavaScript (ES6), 73 octets
Étant donné que nous ne sommes intéressés que par la parité, toute transposition en double est simplement annulée. De manière pratique, les indices de tableau de JavaScript ne sont pas multidimensionnels.
la source
Mathematica, 77 octets
Je suis d'accord!
la source
Cycles
. Il augmente la taille duPermutationCycles
nom de, etPermutationCycles
est même stupide, renvoyant unCycles
objet! `Mathematica, 31 octets
Nous pouvons réorganiser une liste à l'autre, en réordonnant d'abord une liste à n'importe quel ordre (dans ce cas, l'ordre canonique) et réorganiser cette liste à la liste finale. Le signe de la permutation globale est pair, si les signes des deux sous-permutations sont égaux.
la source