我想知道 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
默认版本应该就可以了。
更新:我第一次犯了几个小错误,所以如果你一开始感到困惑,请务必再次查看我的答案。