Partizioni di un elenco


9

La risposta a questa domanda è troppo lunga

La tua sfida è scrivere una funzione di partizionamento nel minor numero di caratteri.

Esempio di input

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

Esempio di output

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

L'input può essere un elenco / array / set / stringa ecc. Qualunque sia la cosa più semplice da elaborare per la tua funzione

Puoi anche scegliere il formato di output adatto a te stesso purché la struttura sia chiara.

La tua funzione dovrebbe funzionare per almeno 6 elementi nell'input


anche la partizione vuota farà parte dell'output?
FUZxxl,

Risposte:


3

GolfScript (43 caratteri)

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

o

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

Stesso formato di input, formato di output e nome della funzione della soluzione Howard. Non c'è forzatura bruta: questo richiede il semplice approccio iterativo di aggiungere un elemento dall'elenco di input alla partizione ogni volta attorno al ciclo esterno.


6

GolfScript, 51 caratteri

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

Lo script definisce una variabile Pche prende un array dalla cima dello stack e rimanda indietro un elenco di tutte le partizioni, ad es

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

Funziona anche su elenchi più grandi:

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

È possibile eseguire i propri test online .


6

J, 51 caratteri

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

Prende input dalla tastiera, elementi separati da spazi:

   ([:<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 byte salvati grazie a nimi .

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

Esempio:

*Main> p "abc"
[["abc"],["bc","a"],["ac","b"],["c","ab"],["c","b","a"]]

A pochi byte per salvare: riorganizzare le parentesi nel 2 ° linea di #: :map(y:)(x#s)e girare la lambda in una versione priva di punti: foldr((=<<).(#))[[]].
nimi,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.