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

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

 正直ものは常に正しいことを言い、うそつきは常にうそを言っているとすると、A~Dのち正直者はだれか。
A「Bはうそつきだ」
B「僕はうそつきじゃない。Cはうそつきだ」
C「僕はうそつきじゃない。Dはうそつきだ」
D「君たちは3人ともうそつきじゃないよ」
選択肢
1 AとB、2 AとC、3 AとD、4 BとC、5 BとD

 「僕はうそつきじゃない」は正直者もうそつきも言うから参考にはならないだけじゃなく、ちょっと問題があるようです。
 たとえば、「Eqv(a,a!=False and ~)」で、「a==False ならば、and以降に無関係に真になってしますので、「a!=False」は省略するか、「Eqv(a,a!=False)」と「Eqv(a,~)」のように分けないといけないようです。(^_^;
 それから、「aはウソつきである」等は、次のように書き換えてもいいようです。
 「aはウソつきである」 ≡「a==False」≡「not a」
 「aはウソつきではない」≡「a!=False」≡「not(not a)」≡「a」
 「aは正直者である」 ≡「a==True」 ≡「a」
 ちなみに、「if not Eqv(b,b)」と「「if not Eqv(c,c)」」は必ずFalseになるのが明らかなので、コメントアウトしました。(^_^;

● Liar4.py

# coding: UTF-8
# Liar4.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 getHonestMen(name,li):
    result = []
    for i in range(len(li)):
        if li[i]:
            result.append(name[i])
    return ','.join(result)

def main():
    tm = time()  # Timer Start
    TF = (True,False)
    cnt = 0
    for p in itertools.product(TF,repeat=4):
        a,b,c,d = p
        if not Eqv(a,not b): continue           # b==False
##        if not Eqv(b,    b): continue           # b!=False
        if not Eqv(b,not c): continue           # c==False
##        if not Eqv(c,    c): continue           # c!=False
        if not Eqv(c,not d): continue           # d==False
        if not Eqv(d,a and b and c): continue   # a==b==c!=False
        # チェックを潜り抜けたものだけを表示
        cnt+=1
        if cnt==1: print('[A B C D]')
        print('%s'%getRowOfTruthTable([a,b,c,d]))
        print(u'∴正直者: %s'%getHonestMen('ABCD',p))

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

if __name__ == '__main__':
    main()

●実行結果

[A B C D]
 T F T F
∴正直者: A,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で解いてみた。