知恵袋の「ウソつき問題」をPythonで解いてみた。(6)

 知恵袋の「ウソつき問題」をPythonで解いてみました。(^_^;
というか、以前、Javaで解いた2つの発言の「うそつき問題」のプログラムPythonに翻訳してみました。(^_^;

 ある事件の容疑者A~Eの5人が、次のような2つの発言をした。5人の発言は1つが真実で、もう一つがうそであるとき、犯人はだれか。
A「私は犯人ではない。」「誰が犯人かは知らない」
B「私は犯人ではない。」「Aが犯人である」
C「私は犯人ではない。」「Bは犯人ではない」
D「私は犯人ではない。」「Cは犯人ではない」
E「私は犯人ではない。」「Dが犯人である」

 Aの発言の「誰が犯人かは知らない」をどう表現するかが問題です。この発言は、Aが犯人でないならば真でも偽でもあり得ますが、Aが犯人ならば、この発言は偽になります。
 よって、「x!='A'」のときは、Trueとして通過させ、「x=='A'」のときは、「Xor(x!='A',False))」をとります。
 これらをまとめて、通過すべき条件を「Imp(x=='A',Xor(x!='A',False))」としてみました。
 ちなみに、これは、「Imp(x=='A',Xor('A'!='A',False))」=「Imp(x=='A',Xor(False,False))」=「Imp(x=='A',False)」=「x!='A'」となります。

● Liar6.py

# coding: UTF-8
# Liar6.py

import itertools
from time import time

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

# 排他的論理和Xor
def Xor(p,q):
    return bool(p^q)  # (p or q) and not(p and q)

def main():
    tm = time()  # Timer Start
    P = 'ABCDE'
    for x in P:
        if not Imp(x=='A',Xor(x!='A',False)): continue
        if not Xor(x!='B', x=='A'): continue
        if not Xor(x!='C', x!='B'): continue
        if not Xor(x!='D', x!='C'): continue
        if not Xor(x!='E', x=='D'): continue
        pass # チェックを潜り抜けたものだけを表示
        print(u'犯人: %s'%x)

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

if __name__ == '__main__':
    main()

●実行結果

犯人: C
Runtime : 0.000 [sec]

※参考URL
知恵袋の「ウソつき問題」を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で解いてみた。