判断推理の帽子の色の問題をPythonで解いてみた。

 知恵袋で見つけた判断推理の帽子の色の問題Pythonで解いてみました。(^_^;

 A〜Dの4人がA,B,C,Dの順に前を向いて縦一列に並んでいるところ、赤い帽子4つ、白い帽子3つのうちから任意に一つを選んでかぶせた。自分より前に並んでいる人の帽子の色はわかるが、自分自身と自分より後ろに並んでいる人の帽子の色はわからない。
 D,C,Bの順に自分の帽子の色がわかるかどうか問うと3人とも「わからない」と答えた。3人の返事を聞いていたAが自分の帽子の色がわかった」と答えた。
 4人全員が最初にあった帽子の数と色の内訳を知っており、自分より後ろの人の発言の内容を参考にして答えたことがわかっているとき、A〜Dの帽子の色に関して言えることとして最も妥当なのはどれか。

1.A、Bのどちらか1人の帽子の色は白色である。
2.Aの帽子の色は赤色である。
3.B、Cのどちらか1人の帽子の色は赤色である。
4.Cの帽子の色は赤色である。
5.Dの帽子の色は白色である。

 Dが自分の帽子の色が(赤であると)わかるのは、前の3人が白の帽子をかぶっている場合だけです。
 Dの「わからない」という発言を聞いたCが、自分の帽子の色が(赤であると)わかるのは、前の2人が白の帽子をかぶっている場合だけです。
 後ろの2人の「わからない」という発言を聞いたBが、自分の帽子の色が(赤であると)わかるのは、Aが白の帽子をかぶっている場合だけです。
 以上より、後ろの3人の「わからない」という発言を聞いて、Aは自分の帽子の色が赤であるとわかったはずです。
 プログラムでは、赤'r'と白'w'の同じものを含む順列で回して、上の3つの場合をスキップしています。(^_^;

● ColorHat1.py

# coding: UTF-8
# ColorHat1.py

from time import time
import itertools

def main():
    tm = time()  # Timer Start
    ch = [False]*5
    P  = 'rrrrwww'
    cnt = 0
    for p in set(itertools.permutations(P,4)):  # 同じものを含む順列
        a,b,c,d = p
        if [a,b,c]==['w','w','w']: continue
        if [a,b]  ==['w','w']    : continue
        if [a]    ==['w']        : continue
        # チェックを潜り抜けたものだけを表示
        cnt+=1
        print('[%d] %s'%(cnt,p))
        # 選択肢のチェック
        if cnt==1: ch = [True]*5
        ch[0] &= ('w' in [a,b])
        ch[1] &= (a=='r')
        ch[2] &= ('r' in [b,c])
        ch[3] &= (c=='r')
        ch[4] &= (d=='w')

    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] ('r', 'r', 'w', 'r')
[2] ('r', 'r', 'w', 'w')
[3] ('r', 'w', 'w', 'r')
[4] ('r', 'w', 'w', 'w')
[5] ('r', 'w', 'r', 'w')
[6] ('r', 'r', 'r', 'w')
[7] ('r', 'w', 'r', 'r')
[8] ('r', 'r', 'r', 'r')
∴ 2
Runtime : 0.002 [sec]

※参考URL
判断推理の帽子の色の問題をJavaで解いてみた。 - rscの日記
https://en.wikipedia.org/wiki/Prisoners_and_hats_puzzle
http://www.lec-jp.com/koumuin/about/try.html