Partitions d'une liste

9

La réponse à cette question est beaucoup trop longue

Votre défi consiste à écrire une fonction de partitionnement dans le plus petit nombre de caractères.

Exemple d'entrée

['a', 'b', 'c']

Exemple de sortie

[(('a'),('b'),('c')),
 (('a', 'b'), ('c')),
 (('a', 'c'), ('b')),
 (('b', 'c'), ('a')),
 (('a', 'b', 'c'))]

L'entrée peut être une liste / tableau / ensemble / chaîne, etc. ce qui est le plus facile à traiter pour votre fonction

Vous pouvez également choisir le format de sortie qui vous convient tant que la structure est claire.

Votre fonction doit fonctionner pour au moins 6 éléments dans l'entrée

grignoteur
la source
la partition vide doit-elle également faire partie de la sortie?
FUZxxl

Réponses:

3

GolfScript (43 caractères)

{[[]]:E\{:v;{:^E+1/{^1$-\[~[v]+]+}/}%}/}:P;

ou

{[[]]:E\{:v;{:^E+1/{^1$-\{[v]+}%+}/}%}/}:P;

Même format d'entrée, format de sortie et nom de fonction que la solution d'Howard. Il n'y a pas de forçage brutal: cela prend l'approche itérative simple d'ajouter un élément de la liste d'entrée à la partition à chaque fois dans la boucle externe.

Peter Taylor
la source
6

GolfScript, 51 caractères

{[[]]\{[.;]`{1$[1$]+@@`1$`{[2$]-@@[+]+}++/}+%}/}:P;

Le script définit une variable Pqui prend un tableau du haut de la pile et repousse une liste de toutes les partitions, par exemple

[1 2] P            # => [[[1] [2]] [[1 2]]]
["a" "b" "c"] P    # => [[["a"] ["b"] ["c"]] [["b"] ["a" "c"]] [["a"] ["b" "c"]] [["a" "b"] ["c"]] [["a" "b" "c"]]]

Il fonctionne également sur de plus grandes listes:

6, P ,p            # prints 203, i.e. Bell number B6
8, P ,p            # 4140

Vous pouvez effectuer vos propres tests en ligne .

Howard
la source
6

J, 51 caractères

([:<a:-.~])"1~.((>:@i.#:i.@!)#l)<@;/."1[l=:;:1!:1[1

Prend la saisie du clavier, éléments séparés par des espaces:

   ([:<a:-.~])"1~.((>:@i.#:i.@!)#l)<@;/."1[l=:;:1!:1[1
a b c
+-----+------+------+------+-------+
|+---+|+--+-+|+--+-+|+-+--+|+-+-+-+|
||abc|||ab|c|||ac|b|||a|bc|||a|b|c||
|+---+|+--+-+|+--+-+|+-+--+|+-+-+-+|
+-----+------+------+------+-------+
Gareth
la source
1

Haskell, 90 87 71 66

5 octets enregistrés grâce à nimi .

x#[]=[[[x]]]
x#(y:s)=((x:y):s):map(y:)(x#s)
p=foldr((=<<).(#))[[]]

Exemple:

*Main> p "abc"
[["abc"],["bc","a"],["ac","b"],["c","ab"],["c","b","a"]]
alephalpha
la source
Quelques octets pour enregistrer: réarranger les parenthèses dans la 2ème ligne de #: :map(y:)(x#s)et tourner le lambda dans une version de point gratuit: foldr((=<<).(#))[[]].
nimi
0

Python 2, 131 octets

def P(L):
 if len(L)<2:yield[L];return
 for p in P(L[1:]):
	for n,s in enumerate(p):yield p[:n]+[[L[0]]+s]+p[n+1:]
	yield[[L[0]]]+p

Essayez-le en ligne

Utilise cet algorithme .

mbomb007
la source