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

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

 A~Eの5人で論争した結果、次のような、A、B、Cの発言があった。
A「Bはウソをついている」
B「Eはウソをついている」
C「Dはウソをついている」
 以上の事ことから判断して確実にいえるのは、次のうちのどれか。
1 ウソつきは3人いる。
2 正直者は3人いる。
3 Bがウソつきであるとき、Dもウソつきである。
4 Eがウソつきであれば、ウソつきはもう2人いる。
5 Aが正直者ならば、Dも正直者である。

 論理等価Eqvだけじゃなく、論理包含Impなど他にも色々、出て来て総合問題になっているようなので、ウソつき問題のまとめとして解いてみました。(^_^;
 正直者をTrue、ウソつきをFalseとすると、「Bはウソをついている」は、「b==False」または、「not b」で表すことができます。
また、「Aは正直者」は、「a==True」または、「a」で表すことができます。
 ちなみに、「ウソつきはもう2人いる」というのは、「ウソつきは全部で3人いる」ということですよね。(^_^;
 それから、getRowOfTruthTable()関数等をリスト内包表記を使って書き直してみました。(^_^;

● Liar5.py

# coding: UTF-8
# Liar5.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

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

# 確実にいえる選択肢を1つ得る
def getAns(choices):
    fmt = '%s' if choices.count(True)==1 else 'Error! {%s}'
    return fmt%getTrue('12345',choices)

def getTrue(s,li):
    return ','.join([s[i] for i in range(len(li)) if li[i]])

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

    print(u'∴%s'%getAns(choices))
    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

[A B C D E]
 T F T F T
 T F F T T
 F T T F F
 F T F T F
∴4
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で解いてみた。(9) - rscのブログ
OKWAVEの「ウソつき問題」をPythonで解いてみた。 - rscのブログ
天使と悪魔と道化の「ウソつき問題」をPythonで解いてみた。 - rscのブログ
知恵袋の「うそつき問題」をJavaで解いてみた。
ネットで見つけた「うそつき問題」をJavaで解いてみた。
ネットで見つけた「うそつき問題」を自分で解いてみた。
2つの発言の「うそつき問題」をJavaで解いてみた。