列表分区


9

这个问题的答案太长了

您面临的挑战是编写最少数量的字符的分区函数

输入例

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

输出例子

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

输入可以是列表/数组/集合/字符串等。您的函数最容易处理的输入

您也可以选择适合自己的输出格式,只要结构清晰即可。

您的函数应至少在输入中包含6个项目


空分区也应成为输出的一部分吗?
FUZxxl 2015年

Answers:


3

GolfScript(43个字符)

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

要么

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

输入格式,输出格式和功能名称与霍华德的解决方案相同。没有暴力破解:这采用了简单的迭代方法,每次围绕外部循环,将输入列表中的一个元素添加到分区中。


6

GolfScript,51个字符

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

该脚本定义了一个变量P,该变量从堆栈顶部获取一个数组,并推回所有分区的列表,例如

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

它也适用于较大的列表:

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

您可以在线执行自己的测试


6

J,51个字符

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

从键盘获取输入,各项目之间用空格隔开:

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

1

哈斯克尔,90 87 71 66

由于nimi节省了5个字节。

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

例:

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

几个字节保存:在2号线重新括号#:map(y:)(x#s)并打开拉姆达为自由点版本:foldr((=<<).(#))[[]]
nimi 2015年

0

Python 2,131字节

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

在线尝试

使用此算法

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.