Las secuencias intercaladas representan una fusión arbitraria de cierto número de secuencias.
Se puede hacer una secuencia intercalada agregando elementos a una lista uno por uno de un número de listas, eligiendo el siguiente elemento de alguna lista cada vez. Por lo tanto, una secuencia intercalada contendrá exactamente los mismos elementos de todas las listas combinadas, en un orden consistente con todas las listas.
La única intercalación de 1 lista es esa misma lista.
Desafío
Su desafío es crear una función / programa que tome un número arbitrario de secuencias y genere todos los posibles entrelazamientos de esas secuencias.
Ejemplos
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]
Reglas
- Lagunas estándar prohibidas (duh)
- La entrada puede tomarse en cualquier formato razonable, por ejemplo, una lista de listas, una lista vararg de listas, listas de parámetros, etc., siempre que no sea ambiguo dónde comienzan y terminan las listas.
- La salida puede estar en cualquier formato razonable, siempre que esté claro dónde comienzan y terminan las listas. Las salidas válidas incluyen, pero no se limitan necesariamente a:
- stdout, con una lista por línea
- Una lista de listas
- Un iterador sobre listas (puede implementarse con un generador si su idioma los tiene)
- El orden de los entrelazados cedidos no importa, sin embargo, no debería haber ningún entrelazado repetido.
- Para simplificar la detección de repetición, puede suponer que todos los elementos en todas las secuencias de entrada son únicos.
- Si no se proporcionan listas como entrada, tanto la lista vacía como ninguna salida son salidas válidas.
- Los tipos de elementos en las secuencias son irrelevantes. (por ejemplo, todos pueden ser de un tipo o una mezcla de tipos, lo que sea más conveniente en su idioma)
- Se debe garantizar que su programa / función termine en un tiempo finito.
- Este es el código de golf , por lo que gana el código más corto para cada idioma.
[[]]
lugar de[]
cuando no se nos dan listas como entrada?Respuestas:
Haskell ,
847776 bytes¡Gracias a @Lynn por 7 bytes y a @ user9549915 por un byte!
Pruébalo en línea!
fuente
Python 2 ,
103927978 bytesPruébalo en línea!
O:
Python 3 , 73 bytes
Pruébalo en línea!
-1 mediante la sustitución
[x[0]]
conx[:1]
como por xnor-13 bytes
robando descaradamenteexpandiéndose según[b[b==x:]for b in A]
lo sugerido por la respuesta de Neil en lugar de unenumerate
enfoque más largo .Toma una lista de listas
A
como entrada. Si todos los elementos deA
están vacíos, la lista evaluada en elif
estará vacía, por lo que hemos llegado al final de la recursión y podemosprint
. De lo contrario, tenemos una lista de uno o másNone
; y recurrimosfuente
[x[0]]
esx[:1]
Jalea , 11 bytes
Pruébalo en línea!
Cómo funciona
fuente
Ruby, 66 bytes
Si no hay secuencias no vacías, devuelva una secuencia vacía. De lo contrario, para cada secuencia no vacía, repita con el primer elemento eliminado y luego agréguelo al comienzo de cada resultado. La implementación utiliza el supuesto de que los elementos están garantizados para ser globalmente únicos, de lo contrario
a-[b]
podría eliminar más de 1 secuencia de la llamada recursiva. Aunque reflexionando, tal vez ese sería realmente el comportamiento correcto para evitar resultados duplicados.Ejemplo 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]]
fuente
Wolfram Language (Mathematica) ,
767571 bytesPruébalo en línea!
Enfoque ingenuo: encuentre todas las permutaciones que son entrelazados de la entrada.
Explicación
Aplane
<input>
y encuentre todas sus permutaciones.Encuentra todos los elementos de
x
manera que ...Reemplace todos los elementos en profundidad-2 de
<input>
con su respectiva posición enx
.Compruebe si todas las listas de profundidad 1 están ordenadas (es decir, en orden creciente).
Implementación real de intercalado, 117 bytes
Pruébalo en línea!
fuente
Python 2 ,
8784 bytesPruébalo en línea! Puerto de mi respuesta de JavaScript. Editar: Guardado 3 bytes gracias a @ChasBrown.
fuente
sum(a,[])
conany(a)
.sum(a,[])
Sin embargo, tiene un buen uso en algunas situaciones.Haskell , 45 bytes
Pruébalo en línea!
Adaptado de la respuesta Python de Chas Brown .
El
max[[]]
es un truco para dar un caso base de[[]]
cuando la entrada solo contiene[]
elementos. En ese caso, la lista utilizada para vacío, recurrente está vacía, ymax[[]][]
da[[]]
.Al recurrir, en lugar de descartar selectivamente el primer elemento de la lista elegida
h:t
, creamos una nueva listat
al frente yh:t
filtrada.fuente
JavaScript (Firefox 30-57), 92 bytes
fuente
Japt
-Q
, 14 bytesToma entrada como una matriz de matrices.
-Q
hace que la salida conserve la notación de matriz.Pruébalo aquí
fuente
Scala: (no pretende ser mínimo, más un recurso de referencia claro)
Pruébalo en línea!
fuente