A TAREFA
DEFINIÇÕES
Considere os pontos {1,2,3,4,5} e todas as suas permutações. Podemos encontrar o número total de permutações possíveis desses 5 pontos com um truque simples: Criação de imagens preenchendo 5 slots com esses pontos, o primeiro slot terá 5 números possíveis, o segundo 4 (como um foi usado para preencher o primeiro slot) o terceiro 3 e assim por diante. Assim, o número total de permutações é 5 * 4 * 3 * 2 * 1; isso seria 5! permutações ou 120 permutações. Podemos pensar nisso como o grupo simétrico S5, e então o grupo simétrico Sn teria n! or (n*n-1*n-2...*1)
permutações.
Uma permutação "par" é aquela em que existe um número par de ciclos de comprimento par. É mais fácil de compreender quando escrito em notação cíclico, por exemplo, (1 2 3)(4 5)
permuta-se 1->2->3->1
e 4->5->4
e tem um ciclo de 3 comprimento (1 2 3)
e um ciclo de 2 comprimento (4 5)
. Ao classificar uma permutação como ímpar ou par, ignoramos os ciclos de comprimento ímpares e dizemos que essa permutação [ (1 2 3)(4 5)
] é ímpar, pois possui um número ímpar {1} de ciclos de comprimento par. Mesmo exemplos:
(1)(2 3)(4 5)
= dois ciclos de 2 comprimentos | MESMO |(1 2 3 4 5)
= sem ciclos de comprimento uniforme | MESMO | * observe que, se não houver ciclos de comprimento iguais, a permutação será uniforme.
Exemplos ímpares:
(1 2)(3 4 5)
= um ciclo de 2 comprimentos | ODD(1)(2 3 4 5)
= um ciclo de 4 comprimentos | ODD
Como exatamente metade das permutações em qualquer grupo simétrico são iguais, podemos chamar o grupo par de Grupo Alternativo N, assim como S5 = 120 A5 = 60 permutações.
NOTAÇÃO
As permutações devem, pelo menos para isso, ser escritas em notação cíclica, onde cada ciclo está entre parênteses diferentes e cada ciclo segue em ordem crescente. Por exemplo, (1 2 3 4 5)
não (3 4 5 1 2)
. E para ciclos com um único número, como: (1)(2 3 4)(5)
os pontos únicos / fixos podem ser excluídos (1)(2 3 4)(5) = (2 3 4)
. Mas a identidade {o ponto em que todos os pontos são fixos (1)(2)(3)(4)(5)
} deve ser escrita como ()
apenas para representá-la.
O DESAFIO
Gostaria que você, no menor código possível, pegue qualquer número inteiro positivo como entrada {1,2,3,4 ...} e exiba todas as permutações do Grupo Alternativo An onde n é a entrada / todos os pares permutações de Sn. Por exemplo:
Input = 3
()
(1 2 3)
(1 3 2)
e
Input = 4
()
(1 2)(3 4)
(1 3)(2 4)
(1 4)(2 3)
(1 2 3)
(1 3 2)
(1 2 4)
(1 4 2)
(1 3 4)
(1 4 3)
(2 3 4)
(2 4 3)
E, como nos exemplos, eu gostaria que todos os ciclos de um comprimento fossem eliminados, e quanto à identidade: saídas de nada,
()
{não apenas entre parênteses, mas com o que você estiver usando para mostrar permutações diferentes} ou id
seja aceitável.
LEITURA EXTRA
Você pode encontrar mais informações aqui:
BOA SORTE
E como esse é o codegolf, quem pode imprimir as permutações do Alternating Group An nos bytes mais curtos ganha.
fonte
[[1, 2], [3, 4]]
vez de(1 2)(3 4)
?(2 3 1 4)
em ordem crescente? Você quer dizer que devemos colocar o menor elemento na frente?(2 3 1 4)
que2->3->1->4->2
ele pode ser escrito(1 4 2 3)
com o seu elemento mais pequeno primeiroRespostas:
Pitão, 26 bytes
Experimente online
Esta solução é baseada em uma bijeção pura entre permutações na notação de uma linha e permutações na notação de ciclo. Obviamente, existe a bijeção óbvia em que as duas notações representam a mesma permutação:
[8, 4, 6, 3, 10, 1, 5, 9, 2, 7] = (1 8 9 2 4 3 6) (5 10 7)
mas isso exigiria muito código. Em vez disso, basta cortar a notação de uma linha em pedaços antes de todos os números menores que todos os seus predecessores, chamar esses ciclos de pedaços e criar uma nova permutação a partir deles.
[8, 4, 6, 3, 10, 1, 5, 9, 2, 7] ↦ (8) (4 6) (3 10) (1 5 9 2 7)
Para reverter essa bijeção, podemos fazer qualquer permutação na forma de ciclo, girar cada ciclo para que seu menor número seja o primeiro, classificar os ciclos para que seus menores números apareçam em ordem decrescente e apagar todos os parênteses.
fonte
id
. Talvez ele pudesse entrar?Mathematica,
844931 bytesComposição de duas funções. Saídas no formulário
{Cycles[{}], Cycles[{{a, b}}], Cycles[{{c, d}, {e, f}}], ...}
representando(), (a b), (c d)(e f), ...
.fonte
J , 53 bytes
Os ciclos em cada permutação são representados como matrizes in a box, pois J irá zerar as matrizes irregulares.
Se a saída estiver relaxada, use 41 bytes
onde cada permutação pode conter um ciclo e zero.
Uso
Para a implementação alternativa,
fonte
Geléia ,
3428 bytesExperimente aqui .
Explicação
Cada linha em um programa Jelly define uma função; o inferior é "
main
".A primeira linha define uma função que testa se um produto de ciclo é ímpar.
A segunda linha normaliza uma partição de uma permutação de
[1…n]
em um produto de ciclo da seguinte maneira:Isso se transformará, por exemplo,
(4 3)(2 5 1)
em(1 2 5)(3 4)
.Aqui está o programa principal. Ele recebe um argumento
n
da linha de comando e:fonte
JavaScript (Firefox 30-57),
220218212211 bytesInfelizmente, 88 bytes são suficientes para gerar o grupo alternativo como uma lista de permutações de
a
, portanto, isso me custa um adicional de132130124123 123 bytes para converter a saída no formato desejado:Consegui reduzir minha versão do ES6 para
222216215 bytes:fonte
(1,2,3)(4,5)
- isso é uma permutação estranha! Atualmente eu mostraria, por exemplo(1,2,3)(4)(5)
- não apenas a remoção de ciclos de comprimento um me custa 6 bytes, como também acabo com um resultado vazio para o ciclo de identidade, o que me custaria outros 4 bytes para corrigir.as for the identity outputs of nothing ... are accepatble
. E também o que seria mostrado se você exibir seus "dados brutos", eles vêm na forma (1,2,3) (4) (5) ou como algo mais?[1, 2, 0, 3, 4]
para esse exemplo em particular, tão longe do que você deseja.GAP , 32 bytes
Obrigado a @ChristianSievers por reduzir a contagem ao meio.
Uso no prompt:
fonte
f:=n->List(AlternatingGroup(n));