知恵袋で見つけた判断推理のダンスのペアの問題を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)