2010-01-04 50 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來達到這個目的,那也可以代替最後三行,我想;-)。