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