Partições de uma lista

9

A resposta a esta pergunta é muito longa

Seu desafio é escrever uma função de particionamento no menor número de caracteres.

Exemplo de entrada

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

Exemplo de saída

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

A entrada pode ser uma lista / matriz / conjunto / string, etc., o que for mais fácil para sua função processar

Você também pode escolher o formato de saída mais adequado, desde que a estrutura esteja limpa.

Sua função deve funcionar para pelo menos 6 itens na entrada

mordedor
fonte
a partição vazia também deve fazer parte da saída?
FUZxxl

Respostas:

3

GolfScript (43 caracteres)

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

ou

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

O mesmo formato de entrada, formato de saída e nome da função que a solução de Howard. Não há força bruta: isso adota a abordagem iterativa simples de adicionar um elemento da lista de entrada à partição toda vez que o loop externo for contido.

Peter Taylor
fonte
6

GolfScript, 51 caracteres

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

O script define uma variável Pque pega uma matriz do topo da pilha e empurra uma lista de todas as partições, por exemplo

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

Também funciona em listas maiores:

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

Você pode realizar seus próprios testes online .

Howard
fonte
6

J, 51 caracteres

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

Recebe entrada do teclado, itens separados por espaços:

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

Haskell, 90 87 71 66

Guardado 5 bytes graças a nimi .

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

Exemplo:

*Main> p "abc"
[["abc"],["bc","a"],["ac","b"],["c","ab"],["c","b","a"]]
alefalpha
fonte
Alguns bytes para salvar: reorganizar os parênteses na 2ª linha de #: :map(y:)(x#s)e transformar o lambda em uma versão livre de ponto: foldr((=<<).(#))[[]].
N /
0

Python 2, 131 bytes

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

Experimente online

Usa esse algoritmo .

mbomb007
fonte