判断推理のダンスのペアの問題をPythonで解いてみた。

 知恵袋で見つけた判断推理のダンスのペアの問題Pythonで解いてみました。(^_^;

 男性A〜Eの5人と女性ア〜オの5人がそれぞれ男女でペアを組み、ダンスをした。毎回ペアを替えて、違う相手と5回踊った。今、それぞれの回で次のようなペアを組んだことが分かっているとき、3回目にB、Dとペアを組んだ相手はそれぞれだれか。
1回目 Bとエ
2回目 Aとオ Cとア
4回目 Dとア Eとイ
5回目 Aとア Bとイ Cとウ Dとエ Eとオ<選択肢>
  B D
1 ア イ
2 ア オ
3 ウ イ
4 ウ オ
5 オ イ

 自力で解く場合は、数独みたいに縦横同じものがだぶらないように表を完成させます。

  +---+---+---+---+---+---+  +---+---+---+---+---+---+  +---+---+---+---+---+---+
  |   | A | B | C | D | E |  |   | A | B | C | D | E |  |   | A | B | C | D | E |
  +---+---+---+---+---+---+  +---+---+---+---+---+---+  +---+---+---+---+---+---+
  | 1 |   |[エ]|   |   |   |  | 1 |   |[エ]|   |   | ア |  | 1 |   |[エ]|   |   | ア |
  +---+---+---+---+---+---+  +---+---+---+---+---+---+  +---+---+---+---+---+---+
  | 2 |[オ]|   |[ア]|   |   |  | 2 |[オ]|   |[ア]|   |   |  | 2 |[オ]| ウ |[ア]|   |   |
  +---+---+---+---+---+---+⇒+---+---+---+---+---+---+⇒+---+---+---+---+---+---+⇒
  | 3 |   |   |   |   |   |  | 3 |   | ア |   |   |   |  | 3 |   | ア |   |   |   |
  +---+---+---+---+---+---+  +---+---+---+---+---+---+  +---+---+---+---+---+---+
  | 4 |   |   |   |[ア]|[イ]|  | 4 |   |   |   |[ア]|[イ]|  | 4 |   | オ |   |[ア]|[イ]|
  +---+---+---+---+---+---+  +---+---+---+---+---+---+  +---+---+---+---+---+---+
  | 5 |[ア]|[イ]|[ウ]|[エ]|[オ]|  | 5 |[ア]|[イ]|[ウ]|[エ]|[オ]|  | 5 |[ア]|[イ]|[ウ]|[エ]|[オ]|
  +---+---+---+---+---+---+  +---+---+---+---+---+---+  +---+---+---+---+---+---+

  +---+---+---+---+---+---+  +---+---+---+---+---+---+  +---+---+---+---+---+---+
  |   | A | B | C | D | E |  |   | A | B | C | D | E |  |   | A | B | C | D | E |
  +---+---+---+---+---+---+  +---+---+---+---+---+---+  +---+---+---+---+---+---+
  | 1 |   |[エ]|   |   | ア |  | 1 |   |[エ]|   |   | ア |  | 1 | イ |[エ]| オ | ウ | ア |
  +---+---+---+---+---+---+  +---+---+---+---+---+---+  +---+---+---+---+---+---+
  | 2 |[オ]| ウ |[ア]|   |   |  | 2 |[オ]| ウ |[ア]| イ | エ |  | 2 |[オ]| ウ |[ア]| イ | エ |
⇒+---+---+---+---+---+---+⇒+---+---+---+---+---+---+⇒+---+---+---+---+---+---+
  | 3 |   | ア |   |   |   |  | 3 |   | ア |   |   | ウ |  | 3 | エ | ア | イ | オ | ウ |
  +---+---+---+---+---+---+  +---+---+---+---+---+---+  +---+---+---+---+---+---+
  | 4 | ウ | オ | エ |[ア]|[イ]|  | 4 | ウ | オ | エ |[ア]|[イ]|  | 4 | ウ | オ | エ |[ア]|[イ]|
  +---+---+---+---+---+---+  +---+---+---+---+---+---+  +---+---+---+---+---+---+
  | 5 |[ア]|[イ]|[ウ]|[エ]|[オ]|  | 5 |[ア]|[イ]|[ウ]|[エ]|[オ]|  | 5 |[ア]|[イ]|[ウ]|[エ]|[オ]|
  +---+---+---+---+---+---+  +---+---+---+---+---+---+  +---+---+---+---+---+---+

● DancePair1.py

# coding: UTF-8
# DancePair1.py

import itertools
from time import time

def toKana(s):
    dic = {'a':'ア','i':'イ','u':'ウ','e':'エ','o':'オ'}
    for k,v in dic.items():
        s = s.replace(k,v)
    return s

def main():
    tm = time()  # Timer Start
    choices = [False]*5
    P = 'aiueo'
    Q = 'ABCDE'
    count = 0
    for d1 in itertools.permutations(P):
        if d1[Q.index('B')]!='e': continue
        for d2 in itertools.permutations(P):
            if d2[Q.index('A')]!='o': continue
            if d2[Q.index('C')]!='a': continue
            for d4 in itertools.permutations(P):
                if d4[Q.index('D')]!='a': continue
                if d4[Q.index('E')]!='i': continue
                for d5 in itertools.permutations(P):
                    if d5[Q.index('A')]!='a': continue
                    if d5[Q.index('B')]!='i': continue
                    if d5[Q.index('C')]!='u': continue
                    if d5[Q.index('D')]!='e': continue
                    if d5[Q.index('E')]!='o': continue
                    for d3 in itertools.permutations(P):
                        if len(set([d1[0],d2[0],d3[0],d4[0],d5[0]]))!=5: continue
                        if len(set([d1[1],d2[1],d3[1],d4[1],d5[1]]))!=5: continue
                        if len(set([d1[2],d2[2],d3[2],d4[2],d5[2]]))!=5: continue
                        if len(set([d1[3],d2[3],d3[3],d4[3],d5[3]]))!=5: continue
                        if len(set([d1[4],d2[4],d3[4],d4[4],d5[4]]))!=5: continue
                        # チェックを潜り抜けたものだけをカウントして表示
                        count+=1
                        print('[%d]'%count)
                        print(' %s'%Q)
                        print('1%s'%toKana(''.join(d1)))
                        print('2%s'%toKana(''.join(d2)))
                        print('3%s'%toKana(''.join(d3)))
                        print('4%s'%toKana(''.join(d4)))
                        print('5%s'%toKana(''.join(d5)))
                        # 選択肢のチェック
                        if count==1: choices = [True]*5
                        tBD = (d3[Q.index('B')],d3[Q.index('D')])
                        choices[0] &= (tBD==('a','i'))
                        choices[1] &= (tBD==('a','o'))
                        choices[2] &= (tBD==('u','i'))
                        choices[3] &= (tBD==('u','o'))
                        choices[4] &= (tBD==('o','i'))

    s = ""
    for c in choices:
        if c : s+=" %s"%(choices.index(c)+1)
    print(u"∴%s"%s)
    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

[1]
 ABCDE
1イエオウア
2オウアイエ
3エアイオウ
4ウオエアイ
5アイウエオ
∴ 2
Runtime : 0.292 [sec]

P.S.
 ちなみに、たとえば、Q.index('A')などのとこを次のように辞書を作って、q['A']とすると、少しですが速くなります。(^_^;

Q = 'ABCDE'
q = {}
for i,k in enumerate(list(Q)):
    q[k] = i

 それから、Python3では、P='アイウエオ'と直接やっても動きますが、Python2.7ではなぜかうまくいきません。(^_^;

※参考URL
Pythonでひらがな/カタカナとローマ字を相互に変換する - つまみ食う
計算ブロックの問題をPythonで解いてみた。
計算ブロックの問題をPythonで解いてみた。(2)