创造所有可能的诗歌排列

时间:2013-10-09 12:15:05

标签: java algorithm math permutation

我的一个朋友写诗,他背后有一个非常特殊的节奏图式。他的所有诗都有4个五线谱,每个五线谱有四条线。所以押韵模式就是这样:

1
2
3
4

2
5
4
6

5
7
6
8

7
1
8
3

他问我有多少排列,如果我可以计算它们,但我真的不知道从哪里开始,除了蛮力,我猜,这不是最佳解决方案。

(编程语言最好是java(script)/ pseudo)

干杯,丹尼尔

3 个答案:

答案 0 :(得分:1)

因为每个押韵类型恰好发生两次和2次! = 2你有2 ^ 8 = 256种可能性假设线条不相等

答案 1 :(得分:0)

考虑创造诗歌排列需要做些什么,密切关注我们必须做出的选择。首先,我们制作了8个类别,每个类别中有两个押韵行(或单词):

rhymes = {
    'A': ['fade', 'made'],
    'B': ['cow', 'how'],
    'C': ['can', 'fan'],
    'D': ['a', 'hey'],
    'E': ['answer', 'hampster'],
    'F': ['whiz', 'is'],
    'G': ['smut', 'what'],
    'H': ['key', 'we'],
    }

要创作一首诗,我们需要选择一个类别的顺序。鉴于押韵方案[1,2,3,4,2,5,4,6,5,7,6,8,7,1,8,3],可能是ABCDBEDFEGFHGAHC。但它同样可能是HGFEGDECDBCABHAF。适合您的押韵计划的类别有许多可能的排序。总共有8个! = 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 40320类别的订单。在组合学中,这被称为8项的排列数。

现在我们有一个排序,例如ABCDBEDFEGFHGAHC,我们可以通过从类别A中选择2个可能的项目中的一个来构建一首诗,然后从类别B中选择2个可能的项目中的一个,等等。 有多少种方法可以做到这一点?那么有2 ^ 8 = 256种方法可以做出8个独立的二元选择。即使有16行,在你做出前8个选择之后,剩下的“选择”也是强制的,因为每个类别只剩下一个选择。

所以总共有

8! * 2**8 = 40320 * 256 = 10321920

或者可能有超过1000万首诗的排列。


在Python中,它有点接近伪代码,你可以列举这样的诗:

import itertools as IT

rhymes = [
    ['fade', 'made'],
    ['cow', 'how'],
    ['can', 'fan'],
    ['a', 'hey'],
    ['answer', 'hampster'],
    ['whiz', 'is'],
    ['smut', 'what'],
    ['key', 'we'],
    ]

scheme = [1,2,3,4,2,5,4,6,5,7,6,8,7,1,8,3]
# shift by 1 since Python uses 0-based indexing
scheme = [i-1 for i in scheme]

# 40320 itmes in orderings
orderings = IT.permutations(rhymes)

count = 0
for ordering in orderings:
    # 256 ways to select the lines given an ordering
    for lines in IT.product(*[IT.permutations(line)
                              for line in ordering]):
        lines = map(iter, lines)
        for i in scheme:
            print(next(lines[i]))
        count += 1
        print

print(count)

产生,例如,

fade
cow
can
a
how
answer
hey
whiz
hampster
smut
is
key
what
made
we
fan

答案 2 :(得分:0)

因为有1种线1 2 3 4 5 6 7 8

第一冷却壁的种类数可以是8 * 7 * 6 * 5 = 1680

第二个冷却壁可以是1 * 4 * 1 * 3 = 12

第3个冷却壁可以是1 * 2 * 1 * 1 = 2

和第4次保存可以是1 * 1 * 1 * 1 = 1

因此总可能性为1680 * 12 * 2 * 1 = 40320