OKWAVEの「ウソつき問題」をPythonで解いてみた。

 OKWAVEの「ウソつき問題」をPythonで解いてみました。(^_^;

 ある一人の子供を見てA~Eの5人が次のように発言した。
A「赤い上着を着ている」
B「青い帽子をかぶっている」
C「白いズボンをはいている」
D「茶色のクツを履いている」
E「黒いズボンをはいている」
 さらに、これらの発言についてそれぞれが次のように発言した。
A「Dはうそをついている」
B「Cはうそをついている」
C「うそをついているのは2人いる」
D「Bはうそをついている」
E「Aはうそをついている」
 嘘をついている人は2つの発言とも嘘をついている。
このときのA~Eの発言の真偽について正しいのはどれか。

 1つ目の発言のチェックは、「for j」~「for s」のループの代わりに、GW法から、cとeの発言の対立に着目して、「if not Imp(c,not e): continue」としてもよいです。(^_^;

● Liar10.py

# coding: UTF-8
# Liar10.py

import itertools
from time import time

# 論理等価Eqv
def Eqv(p,q):
    return not(p^q)

# 論理包含Imp
def Imp(p,q):
    return (not p) or q

def toStr(li):
    return '[%s]'%','.join(li)

# 真理値表の1行を文字列で得る
def getRowOfTruthTable(li):
    return ' '.join(['T' if b else 'F' for b in li])

def main():
    tm = time() # Timer Start
    TF = (True,False)
    for p in itertools.product(TF,repeat=5):
        a,b,c,d,e = p
        # 2つ目の発言のチェック
        if not Eqv(a,not d): continue
        if not Eqv(b,not c): continue
        if not Eqv(c,p.count(False)==2): continue
        if not Eqv(d,not b): continue
        if not Eqv(e,not a): continue
        # 1つ目の発言のチェック
        for j in 'Ro':              # j:上着  (R:赤; o:その他)
            for h in 'Bo':          # h:帽子  (B:青; o:その他)
                for t in 'BWo':     # t:ズボン(B:黒; W:白; o:その他)
                    for s in 'Bo':  # s:靴    (B:茶; o:その他)
                        if not Eqv(a,j=='R'): continue
                        if not Eqv(b,h=='B'): continue
                        if not Eqv(c,t=='W'): continue
                        if not Eqv(d,s=='B'): continue
                        if not Eqv(e,t=='B'): continue
                        pass # チェックを潜り抜けたものだけを表示
                        print('[A B C D E]')
                        print(' %s'%getRowOfTruthTable(p))
                        print('[j,h,t,s] = %s'%toStr([j,h,t,s]))
##        if not Imp(c,not e): continue
##        print('[A B C D E]')
##        print(' %s'%getRowOfTruthTable(p))

    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

[A B C D E]
 T T F F F
[j,h,t,s] = [R,B,o,o]
Runtime : 0.000 [sec]

※参考URL
ウソつき問題とGW法 - PSM
知恵袋の「ウソつき問題」をPythonで解いてみた。 - rscのブログ
知恵袋の「ウソつき問題」をPythonで解いてみた。(2) - rscのブログ
知恵袋の「ウソつき問題」をPythonで解いてみた。(3) - rscのブログ
知恵袋の「ウソつき問題」をPythonで解いてみた。(4) - rscのブログ
知恵袋の「ウソつき問題」をPythonで解いてみた。(5) - rscのブログ
知恵袋の「ウソつき問題」をPythonで解いてみた。(6) - rscのブログ
知恵袋の「ウソつき問題」をPythonで解いてみた。(7) - rscのブログ
知恵袋の「ウソつき問題」をPythonで解いてみた。(8) - rscのブログ
知恵袋の「ウソつき問題」をPythonで解いてみた。(9) - rscのブログ
OKWAVEの「ウソつき問題」をPythonで解いてみた。 - rscのブログ
天使と悪魔と道化の「ウソつき問題」をPythonで解いてみた。 - rscのブログ
知恵袋の「うそつき問題」をJavaで解いてみた。
ネットで見つけた「うそつき問題」をJavaで解いてみた。
ネットで見つけた「うそつき問題」を自分で解いてみた。
2つの発言の「うそつき問題」をJavaで解いてみた。