确定可能组合的数量
我试图找出有多少种可能的方法来组合该字符串中的各种元素。
"{Hello|Hi|Hey} {world|earth}{!|.|?}"
其中从每个组 ({}) 中随机选择一项(由竖线/| 分隔)并组合成单个字符串。
所以上面的“模板”可以产生:
Hello world.
Hi earth?
Hey world.
Hi world?
我猜这是一种排列,但我想确保我得到了正确的结果。
如果这也适用于“n”个嵌套项目,那就太好了。
"{{Hello|Hi|Hey} {world|earth}|{Goodbye|farewell} {noobs|n3wbz|n00blets}}"
如果可能的话,我更喜欢基于数学/统计的解决方案而不是暴力循环来获得答案。
谢谢!
I'm trying to figure out how many possible ways there are to combine various elements form this string.
"{Hello|Hi|Hey} {world|earth}{!|.|?}"
Where one item (separated by a pipe/|) is selected at random from each group ({}) and combined into a single string.
So the above "template" could produce:
Hello world.
Hi earth?
Hey world.
Hi world?
I'm guessing this is a type of permutation, but I want to make sure I'm getting this right.
It would be really nice if this worked with "n" nested items as well.
"{{Hello|Hi|Hey} {world|earth}|{Goodbye|farewell} {noobs|n3wbz|n00blets}}"
I'd prefer a math/statistics based solution over brute-force looping to get the answer if possible.
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
嗯,第一个示例中有 3 x 2 x 3 = 18 种组合。
第二个示例是 3 x 4 x 2 x 3 = 72 种组合。
我不完全确定
{a|b}|{c|d}
你的意思,我假设你的意思是选择(a或b)或(c或d)之一),有4个选择。您可能想在此处或此处。
更新:是的,就是这么简单。你的问题就像计算一个数字中数字组合的数量一样。例如,如果我想查找 ATM PIN 码(4 位十进制数字)的组合数,我有集合 {0-9}、{0-9}、{0-9}、{0-9}。第一选择有 10 种可能性 (= 10)。对于每个数字,第二个选择有 10 种可能性 (= 10 × 10)。对于其中每一个,第三个有 10 个 (= 10 × 10 × 10),第四个有 10 个 (= 10 × 10 × 10 × 10 = 10,000)。直观上应该很清楚,4 位十进制数有 10,000 种可能性。
您的示例使用单词集而不是数字集,但原理是相同的。组合数是集合 1 中的项目数 × 集合 2 中的项目数 × ... × 集合 n 中的项目数等。
当您开始添加限制或从中选择多个项目时,情况会变得更加复杂同一套等
Well, there are 3 x 2 x 3 = 18 combinations in your first example.
Your second example is 3 x 4 x 2 x 3 = 72 combinations.
I'm not entirely sure what you mean by
{a|b}|{c|d}
though, I'm assuming you mean pick one of either (a or b) or (c or d), which is 4 choices.You might want to read up on combinations here or here.
Update: Yep, it's that simple. Your problem is exactly like counting the number of combinations of digits in a number. For example, if I want to find the number of combinations of an ATM PIN number (4 decimal digits), I have sets {0-9}, {0-9}, {0-9}, {0-9}. There are 10 possibilities for the first choice (= 10). For each of those numbers, there are 10 possibilities for the second choice (= 10 × 10). For each of those, there are 10 for the third (= 10 × 10 × 10) and 10 for the fourth (= 10 × 10 × 10 × 10 = 10,000). It should be intuitively clear that there are 10,000 possibilities for a 4 digit decimal number.
Your example uses sets of words instead of sets of digits, but the principle is the same. The number of combinations is the number of items in set 1 × number of items in set 2 × ... × number of items in set n, etc.
It gets more complicated when you start putting restrictions in, or are picking multiple items from the same set, etc.
这个问题分解为两个简单的子问题:
所以对于
1
我会使用一个简单的正则表达式 +循环方法:我也嵌入了
2
,因为无论如何这是最微不足道的部分(如果你热衷于使用reduce
来实现这样的目的,那也可以代替我猜最后三行;-)。The problem breaks down to two simple sub-problems:
So for
1
I'd go with a plain regular expression + looping approach:I've embedded
2
as well since that's the most trivial part anyway (if you're keen on usingreduce
for such purposes, that's OK too in lieu of the last three lines, I guess;-).