Partycje listy

9

Odpowiedź na to pytanie jest zdecydowanie za długa

Wyzwanie polega na napisaniu funkcji partycjonowania przy użyciu jak najmniejszej liczby znaków.

Przykład wprowadzania

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

Przykład wyjściowy

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

Dane wejściowe mogą być listą / tablicą / zestawem / ciągiem itp., Cokolwiek jest najłatwiejsze do przetworzenia przez funkcję

Możesz także wybrać odpowiedni format wyjściowy, o ile struktura jest czysta.

Twoja funkcja powinna działać dla co najmniej 6 pozycji na wejściu

gnibbler
źródło
czy pusta partycja również będzie częścią wyjścia?
FUZxxl

Odpowiedzi:

3

GolfScript (43 znaki)

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

lub

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

Ten sam format wejściowy, format wyjściowy i nazwa funkcji jak rozwiązanie Howarda. Nie ma brutalnego wymuszania: przyjmuje to proste podejście iteracyjne polegające na dodawaniu jednego elementu z listy danych wejściowych do partycji za każdym razem wokół zewnętrznej pętli.

Peter Taylor
źródło
6

GolfScript, 51 znaków

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

Skrypt definiuje zmienną, Pktóra pobiera tablicę z góry stosu i przesuwa listę wszystkich partycji, np

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

Działa również na większych listach:

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

Możesz wykonać własne testy online .

Howard
źródło
6

J, 51 znaków

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

Pobiera dane z klawiatury, elementy oddzielone spacjami:

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

Haskell, 90 87 71 66

Zapisany 5 bajtów dzięki Nimi .

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

Przykład:

*Main> p "abc"
[["abc"],["bc","a"],["ac","b"],["c","ab"],["c","b","a"]]
alephalpha
źródło
Kilka bajtów zapisać: rozmieścić nawiasy w 2. linii #: :map(y:)(x#s)i włączyć lambda w punkcie wolne od wersji: foldr((=<<).(#))[[]].
nimi
0

Python 2, 131 bajtów

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

Wypróbuj online

Używa tego algorytmu .

mbomb007
źródło