Étant donné une liste d'entiers non vide, affichez chaque partitionnement possible de la liste où chaque partition est une sous-liste non vide.
Donc, pour la liste, [1, 2, 3, 4]
le résultat est:
[[1, 2, 3, 4]]
[[1, 2, 3], [4]]
[[1, 2], [3, 4]]
[[1, 2], [3], [4]]
[[1], [2, 3, 4]]
[[1], [2, 3], [4]]
[[1], [2], [3, 4]]
[[1], [2], [3], [4]]
L'ordre des listes dans la sortie n'a pas d'importance, il [[1, 2, 3, 4]]
peut donc être le premier, le dernier ou n'importe où. L'ordre des éléments doit être préservé.
C'est le code-golf, donc la réponse la plus courte l'emporte.
Connexes: partitionnez une liste!
[...]
dans le format de sortie? (Tant que les partitions sont clairement séparées, par exemple par des sauts de ligne.):
comme séparateur de liste mais dans la sortie, les partitions elles-mêmes ne sont pas enveloppées dans une paire supplémentaire de[...]
.[
et le dernier]
de chaque ligne?Réponses:
Gelée , 2 octets
Essayez-le en ligne!
la source
Rétine ,
2719 octetsLe nombre d'octets suppose un codage ISO 8859-1.
Essayez-le en ligne!
Explication
Bien sûr, cela calcule toutes les partitions à l'aide du traitement de chaîne. L'idée de base est que nous pouvons générer toutes les partitions en décidant pour chacune
,
individuellement si nous voulons ou non y diviser la liste. Ce genre de choses peut être fait dans Retina en faisant correspondre chacune,
à son tour et en utilisant un remplacement qui donne les deux sorties possibles.L'entrée agit comme le cas de base: la partition où tous les éléments sont toujours dans une seule liste.
Maintenant, nous faisons correspondre à plusieurs reprises (
+
) la première1
virgule (,
), sur chaque ligne (%
) (en traitant cette ligne comme une chaîne distincte, qui est pertinente pour$'
et `` $ 1 `dans la substitution).Cette virgule est remplacée par:
N'oubliez pas que tout ce qui se trouve devant le match et après le match reste de toute façon dans la chaîne, donc le résultat complet est en fait
$`;$'¶$`];[$'
ce qui explique pourquoi nous insérons le suffixe et le préfixe dans cet ordre.Cette boucle s'arrête une fois que toutes les virgules ont disparu.
Enfin, remplacez à nouveau les points-virgules par des virgules pour correspondre au format d'entrée.
la source
Pure Bash, 28
Ici, les listes sont séparées par deux-points et contenues entre crochets. Par exemple, dans la question, la liste d'entrée serait
1:2:3:4
et la sortie est:Essayez-le en ligne .
${1//:/REPLACEMENT}
remplace les deux points dans$1
par{:,]:[\}
[1{:,]:[}2{:,]:[}3{:,]:[}4]
\
échappements prudents ) provoquent l'expansion de l'accolade en dernier et donnent le résultat souhaité.S'il est nécessaire de faire correspondre exactement la donnée
[[ , , ...]]
format , nous pouvons le faire à la place:Pure Bash, 47
Essayez-le en ligne .
la source
Pyth , 2 octets
Avec entrée
[1, 2, 3, 4]
(par exemple).Explication :
./
est l'opérateur de partition. Il renvoie toutes les divisions de la liste d'entrée en sous-listes disjointes. L'entrée est implicitement envoyée au programme.Testez-le en ligne!
la source
05AB1E , 5 octets
Essayez-le en ligne!
la source
.œ
:: Essayez-le en ligne.Python 3 ,
827266 octetsEssayez-le en ligne!
-5 octets grâce à @JonathanAllan
la source
l
finalementHaskell ,
595549 octetsEssayez-le en ligne!
Solution récursive. Exemple d'utilisation:
p [1,2,3]
retours[[[1,2,3]],[[1,2],[3]],[[1],[2,3]],[[1],[2],[3]]]
.-6 octets grâce à xnor !
la source
do a:b<-p r;[(x:a):b,[x]:a:b]
(cela change l'ordre des listes).<*>
fait exactement ce que vous voulez[\(a:b)->(x:a):b,([x]:)]<*>p r
, bien qu'il soit plus long quedo
parce que le premier lambda semble avoir besoin d'une correspondance de modèle.J , 42 octets
Génère toutes les partitions de sous-liste en créant les clés des sous-listes de partition de longueur 1 et en itérant sur la longueur de la liste d'entrée. Chaque sous-liste de partition est ensuite formée en sélectionnant parmi les clés.
Par exemple, voici le processus de création des clés pour une liste de longueur 4.
Essayez-le en ligne!
la source
J ,
2624 octetsEssayez-le en ligne!
la source
Brachylog , 2 octets
Essayez-le en ligne!
Soumission de fonction qui produit une sortie en agissant comme un générateur. (Le lien TIO contient du code supplémentaire pour en faire un programme complet, à des fins de test.)
Soit dit en passant, bien qu'il ne s'agisse pas techniquement d'une fonction intégrée, elle est si couramment utilisée dans Brachylog que a) elle mérite probablement une représentation sur un octet, et b) la fonction
c
intégrée peut prendre un paramètre pour faire des affirmations sur son entrée (alors qu'avec la plupart des fonctions intégrées, un paramètre parle de la façon de produire la sortie ).Explication
la source
APL, 26 octets
Tester:
Explication:
X←⍴1↓⍵
:X
est la longueur de⍵
(la liste d'entrée) avec son premier élément supprimé⍳2*X
: les nombres [1..2 ^ X](X⍴2)⊤
: représentation en base 2 de ces nombres, avec desX
positions (c'estX
-à- dire que lui - même s'enroulera autour de0
).↓⍉
: faire pivoter la matrice et la diviser le long des lignes (⊤
donne comme résultat une matrice avec les nombres le long des colonnes), donnant un tableau de vecteurs de bits1,¨
: ajoute un 1 à chaque vecteur de bits.⊂∘⍵¨
: pour chaque vecteur de bits, divisé⍵
à chaque 1.la source
Haskell , 45 octets
Essayez-le en ligne!
J'ai trouvé cette solution il y a quelque temps en pensant à une astuce Haskell .
la source
Python , 90 octets
déjoué par les ovules (faisant quelque chose que je pensais avoir essayé de travailler: p)
Une fonction récursive qui construit la liste des partitions à partir des tranches de l'entrée avec la queue atteinte lorsque les tranches sont de longueur 1.
Essayez-le en ligne!
Le
exec
sauvegarde 4 octets sur unewhile
ou 3 sur unefor
boucle (ci-dessous) car cela signifie seulement deux\n
s plutôt que deux niveaux d'indentation, permettant à la fonction entière d'être sur une seule ligne (alors que l'ordre de découpage n'a pas d'importance).la source
Python 3 , 67 octets
Essayez-le en ligne!
la source
Haskell, 59 octets
la source
Rubis ,
6257 octetsEssayez-le en ligne!
Comment ça fonctionne:
la source
JavaScript (ES6), 87 octets
Explication:
b
est la liste des sous-listes précédentes,c
est la sous-liste actuelle, (qui commence comme le premier élément du tableau, car cela doit être dans la première sous-liste) tandis qued
est la liste de toutes les sous-listes. Les autres éléments du tableau sont ensuite traités de manière récursive. Dans chaque cas, il existe deux options: soit l'élément suivant est ajouté à la sous-liste actuelle, soit la sous-liste actuelle est terminée et l'élément suivant commence une nouvelle sous-liste. Les résultats récursifs sont ensuite concaténés ensemble. Lorsque le tableau est épuisé, la liste de liste de toutes les sous-listes est le résultat.la source
APL (NARS) 38 caractères, 76 octets
ceci utilise la fonction Nars 11 1‼ kk mais est très lent, inutilisable pour le tableau arg de 9 éléments déjà ...
ci-dessous est la fonction qui n'utilise pas le intégré:
on voit le type de chaque résultat:
Je ne sais pas comment ça marche, ce n'est qu'un essai heuristique ...
Possible, je fais une erreur; les deux fonctions construisent les partitions de la liste quelle que soit l'entrée et pas seulement 1 2 ... n.
la source
Axiome, 251 octets
Si quelqu'un trouve quelque chose de mieux ... ungof et test:
Si c'est trop d'espace dis ça et j'enlève des exemples ...
la source