Sequências intercaladas representam uma fusão arbitrária de algum número de sequências.
Uma sequência intercalada pode ser feita anexando elementos a uma lista, um a um, a partir de algum número de listas, escolhendo o próximo elemento de uma lista a cada vez. Portanto, uma sequência intercalada conterá exatamente os mesmos elementos de todas as listas combinadas, em uma ordem consistente com todas as listas.
A única intercalação de 1 lista é a mesma lista.
Desafio
Seu desafio é criar uma função / programa que pegue um número arbitrário de seqüências e produza todas as intercalações possíveis dessas seqüências.
Exemplos
Input: [1, 2], [3, 4]
Output:
[1, 2, 3, 4]
[1, 3, 2, 4]
[1, 3, 4, 2]
[3, 1, 2, 4]
[3, 1, 4, 2]
[3, 4, 1, 2]
Input: [1, 2, 3, 4, 5]
Output:
[1, 2, 3, 4, 5]
Input: []
Output:
[]
Input: <nothing>
Output:
[]
(also acceptable)
Input: <nothing>
Output: <nothing>
Input: [1, 2, 3], [4, 5]
Output:
[1, 2, 3, 4, 5]
[1, 2, 4, 3, 5]
[1, 2, 4, 5, 3]
[1, 4, 2, 3, 5]
[1, 4, 2, 5, 3]
[1, 4, 5, 2, 3]
[4, 1, 2, 3, 5]
[4, 1, 2, 5, 3]
[4, 1, 5, 2, 3]
[4, 5, 1, 2, 3]
Input: [1, 2], [3, 4], [5, 6]
Output:
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 5, 4, 6]
[1, 2, 3, 5, 6, 4]
[1, 2, 5, 3, 4, 6]
[1, 2, 5, 3, 6, 4]
[1, 2, 5, 6, 3, 4]
[1, 3, 2, 4, 5, 6]
[1, 3, 2, 5, 4, 6]
[1, 3, 2, 5, 6, 4]
[1, 3, 4, 2, 5, 6]
[1, 3, 4, 5, 2, 6]
[1, 3, 4, 5, 6, 2]
[1, 3, 5, 2, 4, 6]
[1, 3, 5, 2, 6, 4]
[1, 3, 5, 4, 2, 6]
[1, 3, 5, 4, 6, 2]
[1, 3, 5, 6, 2, 4]
[1, 3, 5, 6, 4, 2]
[1, 5, 2, 3, 4, 6]
[1, 5, 2, 3, 6, 4]
[1, 5, 2, 6, 3, 4]
[1, 5, 3, 2, 4, 6]
[1, 5, 3, 2, 6, 4]
[1, 5, 3, 4, 2, 6]
[1, 5, 3, 4, 6, 2]
[1, 5, 3, 6, 2, 4]
[1, 5, 3, 6, 4, 2]
[1, 5, 6, 2, 3, 4]
[1, 5, 6, 3, 2, 4]
[1, 5, 6, 3, 4, 2]
[3, 1, 2, 4, 5, 6]
[3, 1, 2, 5, 4, 6]
[3, 1, 2, 5, 6, 4]
[3, 1, 4, 2, 5, 6]
[3, 1, 4, 5, 2, 6]
[3, 1, 4, 5, 6, 2]
[3, 1, 5, 2, 4, 6]
[3, 1, 5, 2, 6, 4]
[3, 1, 5, 4, 2, 6]
[3, 1, 5, 4, 6, 2]
[3, 1, 5, 6, 2, 4]
[3, 1, 5, 6, 4, 2]
[3, 4, 1, 2, 5, 6]
[3, 4, 1, 5, 2, 6]
[3, 4, 1, 5, 6, 2]
[3, 4, 5, 1, 2, 6]
[3, 4, 5, 1, 6, 2]
[3, 4, 5, 6, 1, 2]
[3, 5, 1, 2, 4, 6]
[3, 5, 1, 2, 6, 4]
[3, 5, 1, 4, 2, 6]
[3, 5, 1, 4, 6, 2]
[3, 5, 1, 6, 2, 4]
[3, 5, 1, 6, 4, 2]
[3, 5, 4, 1, 2, 6]
[3, 5, 4, 1, 6, 2]
[3, 5, 4, 6, 1, 2]
[3, 5, 6, 1, 2, 4]
[3, 5, 6, 1, 4, 2]
[3, 5, 6, 4, 1, 2]
[5, 1, 2, 3, 4, 6]
[5, 1, 2, 3, 6, 4]
[5, 1, 2, 6, 3, 4]
[5, 1, 3, 2, 4, 6]
[5, 1, 3, 2, 6, 4]
[5, 1, 3, 4, 2, 6]
[5, 1, 3, 4, 6, 2]
[5, 1, 3, 6, 2, 4]
[5, 1, 3, 6, 4, 2]
[5, 1, 6, 2, 3, 4]
[5, 1, 6, 3, 2, 4]
[5, 1, 6, 3, 4, 2]
[5, 3, 1, 2, 4, 6]
[5, 3, 1, 2, 6, 4]
[5, 3, 1, 4, 2, 6]
[5, 3, 1, 4, 6, 2]
[5, 3, 1, 6, 2, 4]
[5, 3, 1, 6, 4, 2]
[5, 3, 4, 1, 2, 6]
[5, 3, 4, 1, 6, 2]
[5, 3, 4, 6, 1, 2]
[5, 3, 6, 1, 2, 4]
[5, 3, 6, 1, 4, 2]
[5, 3, 6, 4, 1, 2]
[5, 6, 1, 2, 3, 4]
[5, 6, 1, 3, 2, 4]
[5, 6, 1, 3, 4, 2]
[5, 6, 3, 1, 2, 4]
[5, 6, 3, 1, 4, 2]
[5, 6, 3, 4, 1, 2]
Regras
- Brechas padrão proibidas (duh)
- As entradas podem ser obtidas em qualquer formato razoável, por exemplo, uma lista de listas, vararg lista de listas, listas de parâmetros, etc ... desde que seja inequívoco onde as listas começam e terminam.
- A saída pode estar em qualquer formato razoável, desde que fique claro onde as listas começam e terminam. Saídas válidas incluem, mas não estão necessariamente limitadas a:
- stdout, com uma lista por linha
- Uma lista de listas
- Um iterador sobre listas (pode ser implementado com um gerador se o seu idioma as possuir)
- A ordem das intercalações produzidas não importa, no entanto, não deve haver intercalações repetidas.
- Para simplificar a detecção de repetição, você pode assumir que todos os elementos em todas as seqüências de entrada são únicos.
- Se nenhuma lista for fornecida como entrada, a lista vazia e nenhuma saída serão saídas válidas.
- Os tipos dos elementos nas sequências são irrelevantes. (por exemplo, todos eles podem ser de um tipo ou uma mistura de tipos, o que for mais conveniente no seu idioma)
- Seu programa / função deve ter a garantia de término em um período finito de tempo.
- Isso é código-golfe , portanto o código mais curto para cada idioma vence.
[[]]
vez de[]
quando não recebemos nenhuma lista como entrada?Respostas:
Haskell ,
847776 bytesObrigado a @Lynn por 7 bytes e a @ user9549915 por um byte!
Experimente online!
fonte
Python 2 ,
103927978 bytesExperimente online!
Ou:
Python 3 , 73 bytes
Experimente online!
-1 substituindo
[x[0]]
porx[:1]
conforme xnor-13 bytes,
roubando descaradamente aexpansão,[b[b==x:]for b in A]
conforme sugerido pela resposta de Neil, em vez de umaenumerate
abordagem mais longa .Leva uma lista de listas
A
como entrada. Se todos os elementos deA
estiverem vazios, a lista avaliada emif
estará vazia; portanto, chegamos ao final da recursão e podemosprint
. Caso contrário, temos uma lista de um ou maisNone
's; e nós recomendamos.fonte
[x[0]]
éx[:1]
Gelatina , 11 bytes
Experimente online!
Como funciona
fonte
Ruby, 66 bytes
Se não houver seqüências não vazias, retorne uma sequência vazia. Caso contrário, para cada sequência não vazia, recorra com o primeiro elemento removido e adicione-o no início de cada resultado. A implementação usa a suposição de que os elementos têm garantia de serem exclusivos globalmente; caso contrário,
a-[b]
poderiam remover mais de uma sequência da chamada recursiva. Embora refletindo, talvez esse seja realmente o comportamento certo para evitar saída duplicada.Exemplo IO:
f[[[1,2],[3,4]]] => [[1, 3, 2, 4], [1, 3, 4, 2], [1, 2, 3, 4], [3, 1, 4, 2], [3, 1, 2, 4], [3, 4, 1, 2]]
fonte
Wolfram Language (Mathematica) ,
767571 bytesExperimente online!
Abordagem ingênua: encontre todas as permutações que são intercalações da entrada.
Explicação
Achate
<input>
e encontre todas as suas permutações.Encontre todos os elementos de
x
modo que ...Substitua todos os itens na profundidade 2 de
<input>
com sua respectiva posiçãox
.Verifique se todas as listas de profundidade 1 estão ordenadas (ou seja, em ordem crescente).
Implementação real da intercalação, 117 bytes
Experimente online!
fonte
Python 2 ,
8784 bytesExperimente online! Porta da minha resposta JavaScript. Editar: salvou 3 bytes graças a @ChasBrown.
fonte
sum(a,[])
porany(a)
.sum(a,[])
tem bom uso em algumas situações, no entanto!Haskell , 45 bytes
Experimente online!
Adaptado da resposta Python de Chas Brown .
A
max[[]]
é um truque para dar uma base de caso de[[]]
quando a entrada contém apenas[]
elementos. Nesse caso, a lista usada para vazio e recorrente está vazia emax[[]][]
fornece[[]]
.Ao repetir, em vez de eliminar seletivamente o primeiro elemento da lista escolhida
h:t
, fazemos uma nova listat
na frente eh:t
filtramos.fonte
JavaScript (Firefox 30-57), 92 bytes
fonte
Japonês
-Q
, 14 bytesRecebe a entrada como uma matriz de matrizes.
-Q
faz com que a saída preserve a notação da matriz.Experimente aqui.
fonte
Scala: (não pretende ser mínimo, mais um recurso de referência claro)
Experimente online!
fonte