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

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

 A,B,C,D,E,さんのうち、何人かがうそつきで残りは正直者、5人に「あなたたちのうち、うそつきは何人いますか」と聞くと、下のように答えました。5人のうちうそつきは何人いますか。
A・1人 B・2人 C・3人 D・4人 E・5人

 プログラムでは、正直者をTrue、うそつきをFalseとして、発言者と発言内容の論理等価Eqvをとってみました。(^_^;
 ちなみに、「P Eqv Q」は、「not(P Xor Q)」と同じことです。
ここで、「P Xor Q」=「(P and not Q)or(not P and Q)」=「(P or Q)and not(P and Q)」ですが、簡単に、「P^Q」でもいいようです。(^_^;

● Liar1.py

# coding: UTF-8
# Liar1.py

import itertools
from time import time

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

# 真理値表の1行を文字列で得る
def getRowOfTruthTable(lst):
    result = ""
    for b in lst:
        result += " T" if b else " F"
    return result

def main():
    tm = time()  # Timer Start
    TF = (True,False)
    for p in itertools.product(TF,repeat=5):
        a,b,c,d,e = p
        if not Eqv(a,p.count(False)==1): continue
        if not Eqv(b,p.count(False)==2): continue
        if not Eqv(c,p.count(False)==3): continue
        if not Eqv(d,p.count(False)==4): continue
        if not Eqv(e,p.count(False)==5): continue
        # チェックを潜り抜けたものだけを表示
        print('[A B C D E]')
        print(getRowOfTruthTable(p))
        print(u'∴ %d人'%p.count(False))

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

if __name__ == '__main__':
    main()

●実行結果

[A B C D E]
 F F F T F
∴ 4人
Runtime : 0.001 [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で解いてみた。