Les séquences entrelacées représentent une fusion arbitraire d'un certain nombre de séquences.
Une séquence entrelacée peut être effectuée en ajoutant des éléments à une liste un par un parmi un certain nombre de listes, en choisissant à chaque fois l'élément suivant dans une liste. Par conséquent, une séquence entrelacée contiendra exactement les mêmes éléments de toutes les listes combinées, dans un ordre cohérent avec toutes les listes.
Le seul entrelacement de 1 liste est cette même liste.
Défi
Votre défi est de créer une fonction / programme qui prend un nombre arbitraire de séquences et génère tous les entrelacements possibles de ces séquences.
Exemples
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]
Règles
- Failles standard interdites (duh)
- L'entrée peut être prise dans n'importe quel format raisonnable, par exemple une liste de listes, une liste vararg de listes, des listes de paramètres, etc ... tant qu'il n'est pas ambigu où les listes commencent et se terminent.
- La sortie peut être dans n'importe quel format raisonnable, tant qu'il est clair où les listes commencent et se terminent. Les sorties valides incluent, mais ne sont pas nécessairement limitées à:
- stdout, avec une liste par ligne
- Une liste de listes
- Un itérateur sur les listes (peut être implémenté avec un générateur si votre langue en possède)
- L'ordre des entrelacements produits n'a pas d'importance, cependant, il ne devrait pas y avoir d'entrelacements répétés.
- Pour simplifier la détection de répétition, vous pouvez supposer que tous les éléments de toutes les séquences d'entrée sont uniques.
- Si aucune liste d'entrée n'est donnée, la liste vide et aucune sortie sont des sorties valides.
- Les types d'éléments dans les séquences ne sont pas pertinents. (par exemple, ils pourraient tous être d'un type ou d'un méli-mélo de types, selon ce qui est plus pratique dans votre langue)
- Votre programme / fonction doit être garanti de se terminer dans un laps de temps fini.
- C'est le code-golf , donc le code le plus court pour chaque langue l'emporte.
[[]]
au lieu de[]
ne recevoir aucune liste en entrée?Réponses:
Haskell ,
847776 octetsMerci à @Lynn pour 7 octets et @ user9549915 pour un octet!
Essayez-le en ligne!
la source
Python 2 ,
103927978 octetsEssayez-le en ligne!
Ou:
Python 3 , 73 octets
Essayez-le en ligne!
-1 en remplaçant
[x[0]]
parx[:1]
selon xnor-13 octets en
volant sans vergogne en sedéveloppant[b[b==x:]for b in A]
comme suggéré par la réponse de Neil au lieu d'uneenumerate
approche plus longue .Prend une liste de listes
A
en entrée. Si tous les éléments deA
sont vides, alors la liste évaluée dans leif
sera vide, nous avons donc atteint la fin de la récursivité et le pouvonsprint
. Sinon, nous avons une liste d'un ou plusieursNone
; et nous recurse.la source
[x[0]]
estx[:1]
Gelée , 11 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
Rubis, 66 octets
S'il n'y a pas de séquences non vides, renvoyez une séquence vide. Sinon, pour chaque séquence non vide, répétez avec le premier élément supprimé puis ajoutez-le au début de chaque résultat. L'implémentation utilise l'hypothèse que les éléments sont garantis comme étant globalement uniques, sinon ils
a-[b]
pourraient potentiellement supprimer plus d'une séquence de l'appel récursif. Bien qu'à la réflexion, ce serait peut-être le bon comportement pour éviter la sortie en double.Exemple 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]]
la source
Wolfram Language (Mathematica) ,
767571 octetsEssayez-le en ligne!
Approche naïve: trouvez toutes les permutations qui sont des entrelacements de l'entrée.
Explication
Aplatissez
<input>
et retrouvez toutes ses permutations.Trouvez tous les éléments
x
tels que ...Remplacez tous les éléments en profondeur 2
<input>
par leur position respective dansx
.Vérifiez si toutes les listes de profondeur 1 sont ordonnées (c.-à-d. Dans un ordre croissant).
Implémentation réelle de l'entrelacement, 117 octets
Essayez-le en ligne!
la source
Python 2 ,
8784 octetsEssayez-le en ligne! Port de ma réponse JavaScript. Edit: enregistré 3 octets grâce à @ChasBrown.
la source
sum(a,[])
parany(a)
.sum(a,[])
a une bonne utilisation dans certaines situations, cependant!Haskell , 45 octets
Essayez-le en ligne!
Adapté de la réponse Python de Chas Brown .
C'est
max[[]]
une astuce pour donner un cas de base[[]]
lorsque l'entrée ne contient que des[]
éléments. Dans ce cas, la liste utilisée pour vide, récursif est vide, etmax[[]][]
donne[[]]
.Lors de la récurrence, plutôt que de supprimer sélectivement le premier élément de la liste choisie
h:t
, nous créons une nouvelle liste avect
au début eth:t
filtrée.la source
JavaScript (Firefox 30-57), 92 octets
la source
Japt
-Q
, 14 octetsPrend l'entrée comme un tableau de tableaux.
-Q
fait que la sortie conserve la notation du tableau.Essayez-le ici.
la source
Scala: (pas destiné à être minimal, plus une ressource de référence claire)
Essayez-le en ligne!
la source