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


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.


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 .


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||
|+---+|+--+-+|+--+-+|+-+--+|+-+-+-+|
+-----+------+------+------+-------+

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"]]

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.