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

 知恵袋の「ウソつき問題」をPythonで解いてみました。(^_^;
 以前、Javaで作ったプログラムをPythonへの翻訳ではなく、論理等価Eqvを使って真理値表を調べる方法で作り直してみました。

 ある事件について事情を知っているA~Iが、容疑者について以下のように発言している。この内本当のことを言っているのは3人で、残りの6人は嘘を言っている。本当のことを言っている3人の組み合わせとして正しいものはどれか。ただし実行犯が1人であることはわかっている。
A 犯人はEである。
B 犯人はEではない。
C 自分が犯人である。
D 犯人はCかHである。
E 自分が犯人である。
F 犯人はCである。
G 犯人はCではない。
H 犯人はCでも自分でもない。
I 犯人はEではないし、Hは嘘をついていない。

 プログラムでは、犯人をx(=A~I)とし、また、正直者をTrue、うそつきをFalseとして、発言者(a~i)と発言内容の論理等価Eqvをとって回してみました。(^_^;

● Liar2.py

# coding: UTF-8
# Liar2.py

import itertools
from time import time

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

# 正直者をすべて得る
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
    C = 'ABCDEFGHI'
    TF = (True,False)
    for x in C:
        for p in itertools.product(TF,repeat=9):
            if not p.count(True)==3: continue
            a,b,c,d,e,f,g,h,i = p
            if not Eqv(a,x=='E'): continue
            if not Eqv(b,x!='E'): continue
            if not Eqv(c,x=='C'): continue
            if not Eqv(d,x=='C' or  x=='H'):   continue
            if not Eqv(e,x=='E'): continue
            if not Eqv(f,x=='C'): continue
            if not Eqv(g,x!='C'): continue
            if not Eqv(h,x!='C' and x!='H'):   continue
            if not Eqv(i,x!='E' and h!=False): continue
            # チェックを潜り抜けたものだけを表示
            print(u'犯  人: %s'%x)
            print(u'正直者: %s'%getHonestMen(C,p))

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

if __name__ == '__main__':
    main()

●実行結果

犯  人: H
正直者: B,D,G
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で解いてみた。