终端可以计算组合吗?

终端可以计算组合吗?

我想知道 ubuntu 终端是否可以计算不同的组合(如数学中的 nCr)。但我不只是想要可能的组合数,而是组合本身。

更新:经过更多研究,我发现我需要的不是组合计算器,而是可以进行排列的计算器。

答案1

Shell 本身确实有一个用于生成各种组合的实用程序。我不太清楚这个术语,但它的工作原理如下:

$ echo {1,2,3}{1,2,3}{1,2,3}                                
111 112 113 121 122 123 131 132 133 211 212 213 221 222 223 231 232 233 311 312 313 321 322 323 331 332 333

$ echo {a,b,c}{a,b,c}{a,b,c}                                
aaa aab aac aba abb abc aca acb acc baa bab bac bba bbb bbc bca bcb bcc caa cab cac cba cbb cbc cca ccb ccc

$ echo {0,1}{0,1}{0,1}{0,1}
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

不过,如果我没记错的话,这并不是最理想的,我当时试图生成一个乌克兰电话号码列表(当然是出于科学目的),但最终出现了错误。所以 shell 有其局限性。用特定编程语言编写的工具可能会更有用。

答案2

我不知道有什么出色的命令行工具可以实现这一点,但您可以使用 python 附带的 itertools 库轻松编写一个。例如,我刚刚编写了这个脚本:

#!/usr/bin/env python2

"""
Script based in part on StackOverflow answer at:
http://stackoverflow.com/questions/17434070/generating-all-combinations-of-a-list-in-python
"""

import sys
import itertools

if len(sys.argv) <= 1:
    print 'No arguments provided; exiting.'
    sys.exit()

args = sys.argv[1:]
count = 0

for combolength in range(0, len(args) + 1):
    for subset in itertools.combinations(args, combolength):
        print '#' + str(count) + ': ' + ' '.join(subset)
        count += 1

假设您已经安装了 python2.3+,您可以将该脚本粘贴到名为“combinations.py”的文件中,然后在包含目录中的终端中运行此命令:

python combinations.py arg1 arg2 arg3 arg4 arg5

它将接受任意数量的参数。

例如,如果我想要数字 1、2、3 和 4 的所有组合,我可以运行:

python combinations.py 1 2 3 4

我会得到:

#0: 
#1: 1
#2: 2
#3: 3
#4: 4
#5: 1 2
#6: 1 3
#7: 1 4
#8: 2 3
#9: 2 4
#10: 3 4
#11: 1 2 3
#12: 1 2 4
#13: 1 3 4
#14: 2 3 4
#15: 1 2 3 4

不必是数字。你可以尝试:

python combinations.py pig cow duck

并得到:

#0: 
#1: pig
#2: cow
#3: duck
#4: pig cow
#5: pig duck
#6: cow duck
#7: pig cow duck

希望有帮助!

PS 如果由于某种原因你缺少 python,你可以使用以下命令安装它:

sudo apt-get install python

默认版本应该就可以了。

更新:我第一次犯了几个小错误,所以如果你一开始感到困惑,请务必再次查看我的答案。

相关内容