知恵袋の「ウソつき問題」をPythonで解いてみました。(^_^;
というか、以前、Javaで解いた2つの発言の「うそつき問題」のプログラムをPythonに翻訳してみました。(^_^;
ある事件の容疑者A~Eの5人が、次のような2つの発言をした。5人の発言は1つが真実で、もう一つがうそであるとき、犯人はだれか。
A「私は犯人ではない。」「誰が犯人かは知らない」
B「私は犯人ではない。」「Aが犯人である」
C「私は犯人ではない。」「Bは犯人ではない」
D「私は犯人ではない。」「Cは犯人ではない」
E「私は犯人ではない。」「Dが犯人である」
Aの発言の「誰が犯人かは知らない」をどう表現するかが問題です。この発言は、Aが犯人でないならば真でも偽でもあり得ますが、Aが犯人ならば、この発言は偽になります。
よって、「x!='A'」のときは、Trueとして通過させ、「x=='A'」のときは、「Xor(x!='A',False))」をとります。
これらをまとめて、通過すべき条件を「Imp(x=='A',Xor(x!='A',False))」としてみました。
ちなみに、これは、「Imp(x=='A',Xor('A'!='A',False))」=「Imp(x=='A',Xor(False,False))」=「Imp(x=='A',False)」=「x!='A'」となります。
● Liar6.py
# coding: UTF-8 # Liar6.py import itertools from time import time # 論理包含Imp def Imp(p,q): return (not p) or q # 排他的論理和Xor def Xor(p,q): return bool(p^q) # (p or q) and not(p and q) def main(): tm = time() # Timer Start P = 'ABCDE' for x in P: if not Imp(x=='A',Xor(x!='A',False)): continue if not Xor(x!='B', x=='A'): continue if not Xor(x!='C', x!='B'): continue if not Xor(x!='D', x!='C'): continue if not Xor(x!='E', x=='D'): continue pass # チェックを潜り抜けたものだけを表示 print(u'犯人: %s'%x) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
●実行結果
犯人: 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で解いてみた。