途中で行う必要のある選択に細心の注意を払いながら、詩の順列を作成するために必要なことを考えてみましょう。まず、それぞれに 2 つの押韻行 (または単語) を含む 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 項目の順列の数と呼ばれます。
のような順序付けができると、カテゴリ から 2 つの可能な項目のうち 1 つを選択し、次にカテゴリ B から 2 つの可能な項目のうちABCDBEDFEGFHGAHC
1 つを選択することで、詩を作成できます。A
これを行うにはいくつの方法がありますか? 8 つの独立したバイナリ選択を行うには、2^8 = 256 通りの方法があります。16 行ありますが、最初の 8 つの選択を行うと、各カテゴリに 1 つの選択肢しか残っていないため、残りの「選択」が強制されます。
したがって、合計で
8! * 2**8 = 40320 * 256 = 10321920
または、1,000 万を少し超える詩順列が可能です。
疑似コードにいくぶん近い 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