生成给定元素列表的所有组合,排序


13

编写一个将列表和数字作为输入的代码,并生成带有数字长度的所有可能组合。例如,使用列表{0,1}和数字2

00
01
10
11

您的程序不必在列表中两次或多次出现字符,例如 {0,0,0,0,0,1,1,5,5}

确保按列表顺序打印出已排序的组合:

使用列表{0,1}和数字5(由我的某些代码生成,这是赢的时间太长了):

00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111

但是使用列表{1,0}和数字2

11
10
01
00

如您所见,反向列表表示反向顺序。

看一下结构,就像一棵树。

这是代码高尔夫球,因此以字节为单位的最短代码胜出!


3
我以为这将是重复的,但我找不到一个
Luis Mendo

1
如果输入列表未排序,排序如何工作?
2016年

@Jarko我假设输入的索引的元组在输出中排序
Luis Mendo

1
@brad,除非OP另有说明,否则默认答案为是。
Stewie Griffin

3
我不明白...使用我自己的名字作为用户名怎么了?
Stewie Griffin

Answers:


16

果冻,1 字节

在线试用

笛卡尔幂内置原子,作为带有左参数项和右参数项计数的二元链接,或作为具有第一个参数项和第二参数项计数的完整程序。


1
一个字节!解决了!
LMD

4
你知道吗,我要提交一个零字节的答案!在JAVA中!你怎么样,对吧?:)(虽然如此,但是很不错。打高尔夫。)
OldBunny2800 '16

9

Haskell,20个字节

(mapM id.).replicate

用法示例:

*Main> ( (mapM id.).replicate )  2 "01" 
["00","01","10","11"]
*Main> ( (mapM id.).replicate )  2 "10" 
["11","10","01","00"]

replicate使得n第二个参数的副本,并mapM id构建组合。顺便说一句,mapM id与相同sequence,但少1个字节。



6

Pyth,2个字节

^F

一个以表格形式输入list,number并打印列表列表的程序。

测试套件

怎么运行的

^F   Program. Input: Q
^FQ  Implicit input fill
 F   Fold
^    repeated Cartesian power
  Q  over Q
     Implicitly print

这似乎解决了,但也许其他人可以用一个字节做到这一点?
LMD 2016年

是的,无论如何,其他人还是赢了(果冻,一个字节),但是很好的解决方案
LMD 2016年

6

Perl 6、15个字节

{[X] @^a xx$^b}

说明:

{[X] @^a xx$^b}

{             } # bare block lambda

     @^a        # declare first parameter as Positional
           $^b  # declare second parameter
         xx     # list repeat 「@a」, 「$b」 times

# at this point given 「 (0,1), 5 」
# ((0 1) (0 1) (0 1) (0 1) (0 1))

 [ ]            # list reduce
  X             #    using cross meta-operator

# results in a list of lists
# ((0 0 0 0 0)
#  (0 0 0 0 1)
#  (0 0 0 1 0)
#  (0 0 0 1 1)
#  (0 0 1 0 0)
#  (0 0 1 0 1)
#  ...
#  (1 1 1 1 1))
say {[X] $^a xx$^b}( (0,1), 2 ); # ((0 0) (0 1) (1 0) (1 1))
say {[X] $^a xx$^b}( (1,0), 2 ); # ((1 1) (1 0) (0 1) (0 0))
say {[X] $^a xx$^b}( (0,1,2), 2 );
# ((0 0) (0 1) (0 2) (1 0) (1 1) (1 2) (2 0) (2 1) (2 2))

put {[X] $^a xx$^b}( (0,1), 5 )».join;
# 00000 00001 00010 00011 00100 00101 00110 00111 01000 01001 01010 01011 01100 01101 01110 01111 10000 10001 10010 10011 10100 10101 10110 10111 11000 11001 11010 11011 11100 11101 11110 11111

如果他们从Perl 6正式发行版之后升级到Rakudo发行版,则可以在Ideone上运行它。
布拉德·吉尔伯特b2gills '16

5

JavaScript(Firefox 30 +),55个字节

f=(a,n)=>n?[for(b of a)for(c of f(a,n-1))[b,...c]]:[[]]

我99%的人肯定递归是在JavaScript中实现此目标的最佳方法。


4

Perl,30个字节

28个字节的代码+ -nl标志。

$"=",";say for glob"{@F}"x<>

要运行它:

perl -alE '$"=",";say for glob"{@F}"x<>' <<< "1 0
2"

我认为将输入作为数字列表对于Perl是合乎逻辑的。但是,如果我们允许一些幻想,并使用方括号和逗号作为输入(如问题所示),则可以减少到20个字节

perl -nlE 'say for glob$_ x<>' <<< "{1,0}
2"

说明: glob Perl的最初目的是列表并遍历文件名,但是当其参数包含大括号时,它将生成由每个括号组的一个元素组成的组合。
-a自动拆分输入空间,并将结果放入@F数组。
$"是列表分隔符:是在字符串内列表元素之间插入的分隔符。我们将其设置为,,因此"{@F"}产生{.,.}(如果@F包含0和1)。
然后x是字符串重复运算符(并<>获得一行输入)。
最后,say for遍历由生成的列表glob并打印元素。


4

Mathematica,6个字节

Tuples

比果冻还差:(

用法

Tuples[{0, 1}, 5]

{{0, 0, 0, 0, 0}, {0, 0, 0, 0, 1}, {0, 0, 0, 1, 0}, {0, 0, 0, 1, 1}, {0, 0, 1, 0, 0}, {0, 0, 1, 0, 1}, {0, 0, 1, 1, 0}, {0, 0, 1, 1, 1}, {0, 1, 0, 0, 0}, {0, 1, 0, 0, 1}, {0, 1, 0, 1, 0}, {0, 1, 0, 1, 1}, {0, 1, 1, 0, 0}, {0, 1, 1, 0, 1}, {0, 1, 1, 1, 0}, {0, 1, 1, 1, 1}, {1, 0, 0, 0, 0}, {1, 0, 0, 0, 1}, {1, 0, 0, 1, 0}, {1, 0, 0, 1, 1}, {1, 0, 1, 0, 0}, {1, 0, 1, 0, 1}, {1, 0, 1, 1, 0}, {1, 0, 1, 1, 1}, {1, 1, 0, 0, 0}, {1, 1, 0, 0, 1}, {1, 1, 0, 1, 0}, {1, 1, 0, 1, 1}, {1, 1, 1, 0, 0}, {1, 1, 1, 0, 1}, {1, 1, 1, 1, 0}, {1, 1, 1, 1, 1}}


3

Python,57个字节

from itertools import*
lambda o,n:list(product(*([o]*n)))

代表

未命名函数采用对象列表o和计数,n然后返回组合列表。


3

纯重打击36

printf -vv %$2s
eval echo ${v// /$1}

通过命令行参数输入-该列表是一个用大括号括起来的逗号分隔列表,例如:

./elemcombo.sh "{0,1}" 2

请注意,输入列表需要加引号,因此调用外壳程序不会太早扩展它。

伊迪恩


这似乎不起作用。
Ipor Sircer '16

它只会重复输入n次,不会打印所有可能的组合。
Ipor Sircer '16

@IporSircer我澄清了所需的输入格式。现在对您有用吗?
Digital Trauma

bash a.sh "{0,1}" 2-> {0,1}{0,1}(版本4.4.5(1)
发布

1
@IporSircer看起来TIO可能正在将args放入execve()或类似的调用中。仅当从另一个外壳程序调用脚本时才需要引号,以防止调用外壳程序执行括号。在TIO的情况下,列表不需要引号。 tio.run/nexus/...
数字创伤

3

R53 45字节

function(x,n)rev(expand.grid(rep(list(x),n)))

在线尝试!

rev 是否符合所要求的精确排序顺序(这似乎并不是问题的实质),并增加了5个字节。


rev用于45个字节:)
JayCe

在头脑上有了矩阵,却忘记了结果实际上是一个列表(数据框)。
ngm

1

拍框123字节

(let p((s "")(l(map number->string(sort l <))))
(if(= n(string-length s))(displayln s)(for((i l))(p(string-append s i)l))))

取消高尔夫:

(define(f l n)
  (let loop ((s "")
             (l (map number->string (sort l <))))
    (if (= n (string-length s))
        (displayln s)
        (for ((i l))
          (loop (string-append s i) l)))))

测试:

(f '(0 1) 2)
(f '(0 1) 3)
(f '(0 1) 5)

输出:

00
01
10
11

000
001
010
011
100
101
110
111

00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111

1

PHP,109字节

for($o=$a=array_slice($argv,2);--$argv[1];$o=$c,$c=[])foreach($a as$n)foreach($o as$s)$c[]=$n.$s;print_r($o);

将长度作为第一个参数,并将列表作为任何其他参数。
使用方式如下:

php -r "for($o=$a=array_slice($argv,2);--$argv[1];$o=$c,$c=[])foreach($a as$n)foreach($o as$s)$c[]=$n.$s;print_r($o);" 5 0 1

如果要求长度为0,将遇到“内存不足”的致命错误。


您不必处理长度
0。– LMD

1

05AB1E2 1 字节s

ã

-1个字节感谢@Enigma

在线尝试。

输入为number\nlist,输出为列表列表。

说明:

     # Implicit input `a`, `b`
ã    # Take the Cartesian product of list `b` repeated `a` times

1
您不需要I这里。
Emigna '18年

@Emigna当然啊。我I之所以这样,是因为最初我想弄清楚如何进行多个输入,并颠倒了数字和列表。呆在I那里很傻..谢谢!
凯文·克鲁伊森
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.