判断推理の並び順の問題をPythonで解いてみた。

 知恵袋で見つけた判断推理の並び順の問題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]