Partisi daftar

9

Jawaban atas pertanyaan ini terlalu panjang

Tantangan Anda adalah menulis fungsi pemartisian dalam jumlah karakter terkecil.

Contoh input

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

Contoh keluaran

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

Input dapat berupa daftar / array / set / string dll. Apa pun yang termudah untuk diproses oleh fungsi Anda

Anda juga dapat memilih format output yang sesuai dengan diri Anda selama strukturnya jelas.

Fungsi Anda harus bekerja setidaknya untuk 6 item dalam input

gnibbler
sumber
haruskah partisi yang kosong juga menjadi bagian dari output?
FUZxxl

Jawaban:

3

GolfScript (43 karakter)

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

atau

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

Format input yang sama, format output, dan nama fungsi sebagai solusi Howard. Tidak ada pemaksaan kasar: ini mengambil pendekatan berulang sederhana menambahkan satu elemen dari daftar input ke partisi setiap kali sepanjang lingkaran luar.

Peter Taylor
sumber
6

GolfScript, 51 karakter

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

Script mendefinisikan variabel Pyang mengambil array dari atas tumpukan dan mendorong kembali daftar semua partisi, misalnya

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

Itu juga berfungsi pada daftar yang lebih besar:

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

Anda dapat melakukan tes sendiri secara online .

Howard
sumber
6

J, 51 karakter

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

Mengambil input dari keyboard, item dipisahkan oleh spasi:

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

Haskell, 90 87 71 66

Disimpan 5 byte berkat nimi .

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

Contoh:

*Main> p "abc"
[["abc"],["bc","a"],["ac","b"],["c","ab"],["c","b","a"]]
alephalpha
sumber
Beberapa byte untuk menyimpan: mengatur ulang kurung di garis-2 #: :map(y:)(x#s)dan mengubah lambda menjadi versi titik bebas: foldr((=<<).(#))[[]].
nimi
0

Python 2, 131 byte

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

Cobalah online

Gunakan algoritma ini .

mbomb007
sumber