fundo
A paridade de uma permutação , conforme definida pela wikipedia , é a seguinte:
O sinal ou assinatura de uma permutação σ é denotado sgn (σ) e definido como +1 se σ for par e -1 se σ for ímpar.
O sinal de uma permutação pode ser expresso explicitamente como
sgn (σ) = (−1) ^ N (σ)
onde N (σ) é o número de inversões em σ.
Alternativamente, o sinal de uma permutação σ pode ser definido a partir de sua decomposição no produto das transposições como
sgn (σ) = (−1) ^ m
onde m é o número de transposições na decomposição.
Para aqueles que não gostam da sopa do alfabeto grego em suas contas, tentarei simplificar um pouco a definição com um exemplo (também roubado da wikipedia).
Exemplo
Considere a matriz de entrada {1, 2, 3, 4, 5}
e uma permutação dela, digamos {3, 4, 5, 2, 1}
,. Para passar da matriz original para sua permutação, você deve trocar índices 0
e 2
, 1
e 3
, then 2
e 4
. Embora essa não seja uma solução exclusiva, a paridade é bem definida e, portanto, funciona para todos os casos.
Como requer 3 swaps, rotulamos essa permutação com odd
paridade. Como você poderia esperar, uma permutação que requer uma quantidade uniforme de swaps é considerada even
paridade.
Desafio
Seu desafio é escrever um programa no menor número de bytes possível para determinar a paridade de uma permutação. Seu programa ou função deve:
- Aceite como argumentos, duas matrizes de entrada (ou cadeias) representando um conjunto antes e depois de uma permutação.
- Retorne ou imprima o caractere
e
para par ouo
ímpar, dada a permutação. - Deve assumir que todos os índices nas matrizes ou cadeias tenham valores exclusivos.
Casos de teste
Supondo que você declarou uma função denominada f
:
f([10], [10]) == "e"
f([10, 30, 20], [30, 20, 10]) == "e"
f([10, 30, 20, 40], [30, 20, 40, 10]) == "o"
Este é o código-golfe , o programa mais curto em bytes vence!
fonte
[10], [10] -> e
(zero transposição).[10 30 20], [30 20 10] -> e
(duas transposições).[10 30 20 40], [30 20 40 10] -> o
(três transposições)Respostas:
Gelatina,
1312 bytesExperimente online!
Como funciona
fonte
MATL ,
1716 bytes1 byte removido graças a uma sugestão de Dennis
Isso funciona na versão atual (15.0.0) do idioma.
Experimente online !
Explicação
Isso usa a definição de paridade em termos de inversões. Uma inversão é um par de elementos na segunda matriz que estão na ordem "incorreta" em comparação com a primeira matriz. Como a primeira matriz não precisa ser classificada, primeiro a classificamos e o mesmo rearranjo necessário para essa classificação é aplicado à segunda matriz. Então uma inversão corresponde a um par de elementos que não está aumentando na segunda matriz.
Observe também que as duas matrizes de entrada podem ser trocadas e o resultado é o mesmo. Portanto, não é importante qual array é considerado o "original" e qual o "permutado".
fonte
x(1:end-2)
etc, sem indicar explicitamente o tamanho dex
. Não tenho certeza se foi uma boa escolha, mas eu acho que é tarde demais para mudar agora :-) Talvez eu vou encontrar uma maneira compatível para adicionar indexação modular0
tem o significado de "última entrada", para que eu possa salvar um byte (remover o incremento). Obrigado pela ideia!Oitava,
5652 bytesParece que ninguém está usando essa abordagem até agora: Basicamente, estou apenas usando os determinantes das matrizes de permutação correspondentes. A expressão
det(eye(nnz(a))(a,:))
retorna o determinante da matriz de permutação definida pelo vetora
. Depois, basta extrair o caractere certo da string, dependendo do resultado.fonte
Haskell, 58 bytes
Uso:
O mesmo método da minha resposta em Python . proud haskeller salvou um byte com
cycle
.fonte
cycle"eo"!!...
Em vez de"eo"!!mod(...)2
salvar um byte.Python 2, 68 bytes
Uso:
Conta o número de pares de inversão de duas listas compactadas, i, e. valores
(a,A)
e(b,B)
de cada lista no mesmo índice coma<b
eA>B
. Essas comparações são combinadas comoa<b<M>A>B
, usando a propriedade que a listaM
é maior que qualquer número. A soma é então tomada no módulo 2 e transformada eme
ouo
.fonte
JavaScript (ES6), 73 bytes
Como estamos interessados apenas na paridade, qualquer transposição duplicada simplesmente é cancelada. Convenientemente, os subscritos da matriz do JavaScript não são multidimensionais.
fonte
Mathematica, 77 bytes
Concordo!
fonte
Cycles
. Ele aumenta o tamanho doPermutationCycles
nome e atéPermutationCycles
é estúpido, retornando umCycles
objeto! ``Mathematica, 31 bytes
Podemos reordenar uma lista para a outra, primeiro reordenando uma lista para qualquer ordem (neste caso, a ordem canônica) e reordenando essa lista para a lista final. O sinal da permutação geral é uniforme, se os sinais das duas sub-permutações forem iguais.
fonte