Antecedentes
La paridad de una permutación , según lo define wikipedia , es la siguiente:
El signo o firma de una permutación σ se denota sgn (σ) y se define como +1 si σ es par y −1 si σ es impar.
El signo de una permutación puede expresarse explícitamente como
sgn (σ) = (−1) ^ N (σ)
donde N (σ) es el número de inversiones en σ.
Alternativamente, el signo de una permutación σ se puede definir a partir de su descomposición en el producto de transposiciones como
sgn (σ) = (−1) ^ m
donde m es el número de transposiciones en la descomposición.
Para aquellos de ustedes que no son aficionados a la sopa del alfabeto griego en sus matemáticas, intentaré simplificar un poco la definición con un ejemplo (también robado de wikipedia).
Ejemplo
Considere la matriz de entrada {1, 2, 3, 4, 5}
, y una permutación de ella, digamos, {3, 4, 5, 2, 1}
. Para pasar de la matriz original a su permutación, debe intercambiar índices 0
y 2
, 1
y 3
, luego 2
y 4
. Aunque esta no es una solución única, la paridad está bien definida, por lo que funciona para todos los casos.
Como requiere 3 intercambios, etiquetamos esta permutación con una odd
paridad. Como es de esperar, se dice que una permutación que requiere una cantidad pareja de intercambios tiene una even
paridad.
Desafío
Su desafío es escribir un programa en la menor cantidad de bytes posible para determinar la paridad de una permutación. Su programa o función debe:
- Acepte como argumentos, dos matrices de entrada (o cadenas) que representan un conjunto antes y después de una permutación.
- Devuelve o imprime el carácter
e
par oo
impar, dada la permutación. - Debe suponer que todos los índices en las matrices o cadenas tienen valores únicos.
Casos de prueba
Asumiendo que declaró una función llamada f
:
f([10], [10]) == "e"
f([10, 30, 20], [30, 20, 10]) == "e"
f([10, 30, 20, 40], [30, 20, 40, 10]) == "o"
Este es el código de golf , ¡el programa más corto en bytes gana!
fuente
[10], [10] -> e
(cero transposiciones).[10 30 20], [30 20 10] -> e
(dos transposiciones).[10 30 20 40], [30 20 40 10] -> o
(tres transposiciones)Respuestas:
Jalea,
1312 bytesPruébalo en línea!
Cómo funciona
fuente
MATL ,
1716 bytes1 byte eliminado gracias a una sugerencia de Dennis
Esto funciona en la versión actual (15.0.0) del lenguaje.
Pruébalo en línea !
Explicación
Esto usa la definición de paridad en términos de inversiones. Una inversión es un par de elementos en la segunda matriz que están en el orden "incorrecto" en comparación con la primera matriz. Como no es necesario ordenar la primera matriz, primero la clasificamos y la misma reorganización necesaria para esa clasificación se aplica a la segunda matriz. Entonces, una inversión corresponde a un par de elementos que no aumentan en la segunda matriz.
Tenga en cuenta también que las dos matrices de entrada se pueden intercambiar y el resultado es el mismo. Por lo tanto, no es importante qué matriz se considera "original" y cuál "permutado".
fuente
x(1:end-2)
etc. sin indicar explícitamente el tamaño dex
. No estoy seguro de si fue una buena opción, pero supongo que es demasiado tarde para cambiar ahora :-) Tal vez encuentre una forma compatible de agregar indexación modular0
tiene el significado de "última entrada", por lo que puedo guardar un byte (eliminar el incremento). Gracias por la idea!Octava,
5652 bytesParece que nadie está usando este enfoque hasta ahora: Básicamente solo estoy usando los determinantes de las matrices de permutación correspondientes. La expresión
det(eye(nnz(a))(a,:))
devuelve el determinante de la matriz de permutación definida por el vectora
. Entonces es solo cuestión de extraer el carácter correcto de la cadena, dependiendo del resultado.fuente
Haskell, 58 bytes
Uso:
El mismo método que mi respuesta de Python . orgulloso haskeller salvó un byte con
cycle
.fuente
cycle"eo"!!...
lugar de"eo"!!mod(...)2
guardar un byte.Python 2, 68 bytes
Uso:
Cuenta el número de pares de inversión de dos listas comprimidas, i, e. valores
(a,A)
y(b,B)
de cada lista en el mismo índice cona<b
yA>B
. Estas comparaciones se combinan comoa<b<M>A>B
, utilizando la propiedad de que la listaM
es mayor que cualquier número. Luego se toma la suma del módulo 2 y se convierte ene
oo
.fuente
JavaScript (ES6), 73 bytes
Como solo estamos interesados en la paridad, cualquier transposición duplicada simplemente se cancela. Convenientemente, los subíndices de matriz de JavaScript no son multidimensionales.
fuente
Mathematica, 77 bytes
¡Estoy de acuerdo!
fuente
Cycles
. Aumenta el tamaño delPermutationCycles
nombre e inclusoPermutationCycles
es estúpido, ¡devuelve unCycles
objeto! `Mathematica, 31 bytes
Podemos reordenar una lista a la otra, primero reordenando una lista a cualquier orden (en este caso el orden canónico) y reordenar esta lista a la lista final. El signo de la permutación general es par, si los signos de las dos subpermutaciones son iguales.
fuente