Dadas duas permutações na forma de ciclo separado, produza seu produto / composição na forma de ciclo separado.
Para encontrar a composição, converta os ciclos disjuntos em permutações em notação de duas linhas. Cada número em uma parte separada de um ciclo é mapeado para o número seguinte na mesma parte. Envolve. Assim 1 -> 5
, 5 -> 1
, 2 -> 4
, 4 -> 2
. Se um número não for encontrado 3 -> 3
, ele será mapeado para si mesmo. O primeiro ciclo separado também pode ser escrito (1 5)(2 4)(3)
. Esses mapeamentos são convertidos em duas linhas, assim (observe que a ordem de P e Q é invertida):
[O] produto de duas permutações é obtido reorganizando as colunas da segunda permutação (mais à esquerda), de modo que sua primeira linha seja idêntica à segunda linha da primeira permutação (à direita). O produto pode então ser escrito como a primeira linha da primeira permutação sobre a segunda linha da segunda permutação modificada.
Regras:
- A entrada será fornecida como uma lista de listas ou formato semelhante
- Você não pode levar algo
(1 5)(2 4)
como[5, 4, 3, 2, 1]
, já em forma de duas linhas (índice de mapeamento para valor) - Nem todos os números precisam ocorrer em cada grupo; portanto, você pode ter
(1 5)·(1 2)
, resultando em(2 5 1)
. - Sua saída deve poder ser usada como sua entrada.
- Você não precisa dar suporte à entrada com um ciclo vazio
(1 5)·()
. Em vez disso, isso seria dado como(1 5)·(1)
ou algo equivalente. - Como os ciclos são concluídos, o pedido não importa, desde que o resultado esteja correto.
- Você pode começar em zero ou um. Não importa, porque os resultados são os mesmos.
- Os números podem ser maiores que
9
. - Você não pode incluir o mesmo número mais de uma vez na saída. Então
[[1],[1]]
não é permitido. - Observe que esta operação não é comutativa ! Coloquei Q antes de P, porque foi o que a Wikipedia fez. Você pode escolher qualquer ordem, mas especifique qual é a diferença.
- O código mais curto vence
- Os internos são permitidos, mas se você usar um, mostre uma solução sem usá-la também.
Exemplos:
Nem todas as possibilidades de saída equivalentes são mostradas
Input
Output
[[1, 5], [2, 4]], [[1, 2, 4, 3]]
[[1, 4, 3, 5]] (or [[4, 3, 5, 1]] or ...)
[[1, 5]], [[1, 2]]
[[2, 5, 1]]
[[10, 2, 3]], [[2]]
[[3, 10, 2]]
[[1]], [[3]]
[[]] (or [[1]] or something equivalent)
[[10,2,3,15],[1,7],[5,6],[14,4,13,11,12]], [[5,6,7,9,14],[2,8,3,10],[1,11]]
[[12, 14, 6, 1], [8, 15, 10, 3, 2], [13, 11, 7, 9, 4]]
(arguments in reverse order from above gives a different answer)
[[5,6,7,9,14],[2,8,3,10],[1,11]], [[10,2,3,15],[1,7],[5,6],[14,4,13,11,12]]
[[9, 14, 4, 13, 1], [10, 8, 3, 15, 2], [7, 11, 12, 5]]
fonte
Respostas:
J , 7 bytes
Experimente online!
fonte
Mathematica, 15 bytes
Sim, Virgínia, existe um .... O Mathematica suporta um tipo de dados de permutação já em notação de ciclo separado: essa função pura recebe como entrada qualquer número de argumentos no formulário
Cycles[{{1, 5}, {2, 4}}]
e gera a permutação do produto, novamente noCycles[]
formulário. Ele usa a convenção de pedidos oposta como o OP, por exemplo,retorna
Cycles[{{1, 4, 3, 5}}]
. O⊙
símbolo que usei acima deve realmente ser o símbolo Unicode de uso privado de 3 bytes U + F3DE para funcionar no Mathematica. Observe que o Mathematica possui um built-in nomeado para esta operaçãoPermutationProduct
, mas são três bytes a mais.fonte
Haskell ,
157148 bytesEDITAR:
p++q
. Ordem de argumento trocada deg
. Livre-se ded
começariterate
comp x
, após o qualtakeWhile
não será mais vinculado comfst
+span
.iterate
Infix feito .Fazendo isso enquanto estou atrasado ... provavelmente pode jogar golfe um pouco mais.
Como era mais simples e parecia permitido, a saída inclui ciclos de elemento único.
Experimente online!
Como funciona:
#
é a função principal.q#p
pega duas listas de números e retorna uma lista semelhante. Os testes parecem ter Q antes de P, então usei a mesma ordem.f p
converte a permutaçãop
da forma de ciclo separado em uma função, após a qualf q
ef p
pode ser composta com o operador de composição usual.
.c
, procurandoa
e encontrando seu sucessor. Se a compreensão não encontrar nada,a
é apenas retornado.zip(0:c)(c++c)
é uma lista de pares de elementosc
e seus sucessores. Como a pergunta nos permite "começar de uma vez", podemos usar0
como um valor fictício; é mais barato acrescentar essezip
primeiro argumento do que usá-lotail
no segundo.g l p
pega uma listal
de elementos e uma função de permutaçãop
e retorna a lista de ciclos que tocam nos elementos.c
está o ciclo que contém o primeiro elementox
da lista, os outros elementos dec
são encontrados iterando dep x
até quex
seja encontrado novamente. Ao recorrer para encontrar os ciclos restantes, todos os elementos dec
são removidos primeiro com uma compreensão da lista.fonte
Python, 220 bytes
fonte
Python 3.8 , 187 bytes
Experimente online! ou Verifique todos os casos de teste!
Entrada :
q
ep
nessa ordem, cada um é um conjunto de tuplas, deSTDIN
.Saída : a permutação do produto
Q·P
como um conjunto de tuplas, paraSTDERR
.Explicação
A função
g
localiza qual número é mapeado para o númeroi
na permutaçãop
(akag
é a permutação inversa dep
).A função
h
recebe um número e retorna o cicloQ·P
que contém esse número. O ciclo retornado será uma tupla, formatada de forma que o menor elemento esteja no índice 0.Aplicando
h
a todos os números, podemos obter todos os ciclosQ·P
. Para evitar ciclos duplicados em nosso resultado, simplesmente colocamos todos os ciclos em um conjunto. Isso funciona, pois ciclos semelhantes retornados porh
serão formatados para a mesma tupla (com o menor elemento no índice 0).Só precisamos considerar os números que aparecem em
P
ouQ
, como todos os outros números serão mapeados para eles mesmos.fonte