2010-01-04 49 views
1

我想弄清楚有多少种可能的方式来组合这个字符串的各种元素。确定可能的组合数

"{Hello|Hi|Hey} {world|earth}{!|.|?}" 

当一个项目(由竖线/ |)是随机选择从每个组({})并组合成一个字符串。

所以上面的“模板”可以产生:

Hello world. 
Hi earth? 
Hey world. 
Hi world? 

我猜这是一种排列的,但我要确保我得到这个权利。

这将是非常好的,如果这与“n”嵌套项目一起工作。

"{{Hello|Hi|Hey} {world|earth}|{Goodbye|farewell} {noobs|n3wbz|n00blets}}" 

我宁愿过暴力循环,如果能够得到答案数学/统计基础的解决方案。

谢谢!

回答

6

那么,你的第一个例子中有3 x 2 x 3 = 18个组合。

第二个例子是3 x 4 x 2 x 3 = 72个组合。

虽然我并不完全确定你的意思是{a|b}|{c|d},但我假设你的意思是选择其中一个(a或b)或(c或d),这是4个选择。

您可能需要阅读组合herehere


更新:是的,就是这么简单。你的问题就像计算一个数字中数字组合的数量一样。例如,如果我想查找ATM PIN号码(4位十进制数字)的组合数,我有{0-9},{0-9},{0-9},{0-9}组。首选有10种可能性(= 10)。对于每个数字,第二选择有10种可能性(= 10 × 10)。对于每一个,有10个为第三个(= 10 10)和10个为第四个(= 10 10 = 10,000)。应该直观地清楚,对于4位十进制数,有10,000个可能性。

您的示例使用了一组单词而不是数字集,但原理相同。组合的数目是项目的设定1 ×数集的项目数2 × ... ×数组n项等

当你开始把限制的,或者是它变得更复杂从同一套中挑选多件物品等

+0

真的那么简单吗?我不需要使用某种排列? (http://en.wikipedia.org/wiki/Permutation) – erikcw 2010-01-04 18:17:48

+0

@erikcw查看上面的更新。 – Seth 2010-01-04 19:03:23

+0

要做子选择{world | earth} | {Goodbye | farewell}只是递归地运行解析算法来获取子部分值并继续处理。 – 2010-01-04 19:09:36

0

的问题分解为两个简单的子问题:

  1. 算多少组合括号内vbars中分离出来,每个括号对
  2. 乘以这些数字

所以对于1我会用简单的正则表达式+循环方法:

import re 

def docount(thestring): 
    x = re.compile(r'{([^}]}') 
    counts = [mo.group(0).count('|')+1 for mo in x.finditer(thestring)] 
    result = 1 
    for c in counts: result *= c 
    return result 

我已经嵌入了2,因为无论如何这是最微不足道的部分(如果你热衷于使用reduce来达到这个目的,那也可以代替最后三行,我想;-)。