知恵袋で見つけた判断推理の並び順の問題をPythonで解いてみました。(^_^;
A〜Eの5人が前を向いて縦一列に並んでいる。この並びかたについて5人のうち3人がそれぞれ次のア〜ウのように話したとき、並び順について確実に言えるのはどれか?
ア Aのすぐ後ろにCが、Cのすぐ後ろに私が並んでいた。
イ 私は前から3番目に並んでおり、Bは前から4番目か5番目にいた。
ウ 私はEのすぐ後ろに並んでいた。
<選択肢>
1 一番前に並んでいるのはEである。
2 AはDより前に並んでいる。
3 EはCより前に並んでいる。
4 前から5番目に並んでいるのは、Bである。
5 CはBより前に並んでいる。
条件ア,イ,ウのそれぞれの私をx,y,zとして、条件を図で表すと次のようになります。
+---+---+---+ 条件ア | A | C | x | +---+---+---+ +---+---+---+---+---+ +---+---+---+---+---+ 条件イ | | | y | B | | or | | | y | | B | +---+---+---+---+---+ +---+---+---+---+---+ +---+---+ 条件ウ | E | z | +---+---+
条件を組み合わせると、自力でも簡単に解けてしまいますが、プログラムを作って検算すると次のようになります。(^_^;
● AlignmentSeq1.py
# coding: UTF-8 # AlignmentSeq1.py from time import time import itertools def main(): tm = time() # Timer Start ch = [False]*5 P = 'ABCDE' cnt = 0 for p in itertools.permutations(P): if p.index('A')+1!=p.index('C'): continue # 条件ア if p.index('B')+1< 4: continue # 条件イ for q in itertools.permutations(P,3): x,y,z = q # 条件ア,イ,ウのそれぞれの私 if p.index('C')+1!=p.index(x): continue # 条件ア if p.index(y)+1!=3: continue # 条件イ if p.index('E')+1!=p.index(z): continue # 条件ウ # チェックを潜り抜けたものだけを表示 cnt+=1 print('[%d] %s : %s'%(cnt,''.join(p),q)) # 選択肢のチェック if cnt==1: ch = [True]*5 ch[0] &= (p.index('E')+1==1) ch[1] &= (p.index('A')< p.index('D')) ch[2] &= (p.index('E')< p.index('C')) ch[3] &= (p.index('B')+1==5) ch[4] &= (p.index('C')< p.index('B')) s = "" for c in ch: if c : s+=" %s"%(ch.index(c)+1) print(u"∴%s"%s) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
●実行結果
[1] DACEB : ('E', 'C', 'B') [2] EACBD : ('B', 'C', 'A') [3] EACDB : ('D', 'C', 'A') [4] EDACB : ('B', 'A', 'D') ∴ 5 Runtime : 0.000 [sec]