知恵袋の「ウソつき問題」をPythonで解いてみました。(^_^;
天使、悪魔、人間の3人がいます。 天使は真実、悪魔は嘘、人間は真実・嘘、両方言います。
A「私は天使ではありません」
B「私は人間ではありません」
C「私は悪魔ではありません」
3人の正体を教えてください。
天使を'A'、悪魔を'D'、人間を'H'としました。
発言者が人間のとき、真実・嘘、両方言うのでスルーさせ、人間じゃないとき、Eqv()をとって、通過すべき条件を「Imp(x!='H',Eqv(x=='A',{発言内容}))」としてみました。
ここで、発言者をxとすると、「x=='A'」で正直者かそうでないかを判定しました。
プログラムを実行しなくても、通過条件を式変形するだけでも実行結果がわかりそうですね。(^_^;
「Imp(a!='H',Eqv(a=='A',a!='A'))」⇒「Imp(a!='H',False)」⇒「a=='H'」
P.S.
ちなみに、条件式の変形から、プログラムを実行せずに自分で解いてみると、次のようになります。
Imp(a!='H',Eqv(a=='A',a!='A'))==Imp(a!='H',False)==True
∴(a!='H')==False
∴a=='H' (A:人間)
∴Imp(b!='H',Eqv(b=='A',b!='H'))==Imp(True,Eqv(b=='A',True))==True
∴Eqv(b=='A',True)==True
∴(b=='A')==True
∴b=='A' (B:天使)
∴Imp(c!='H',Eqv(c=='A',c!='D'))==Imp(True,Eqv(False,c!='D'))==True
∴Eqv(False,c!='D')==True
∴(c!='D')==False
∴c=='D' (C:悪魔)
● Liar7.py
# coding: UTF-8 # Liar7.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 def main(): tm = time() # Timer Start dic = {'A':'天使', 'D':'悪魔', 'H':'人間'} P = 'ADH' for p in itertools.permutations(P): a,b,c = p if not Imp(a!='H',Eqv(a=='A',a!='A')): continue if not Imp(b!='H',Eqv(b=='A',b!='H')): continue if not Imp(c!='H',Eqv(c=='A',c!='D')): continue pass # チェックを潜り抜けたものだけを表示 print(u'A:%s, B:%s, C:%s'%(dic[a],dic[b],dic[c])) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
●実行結果
A:人間, B:天使, 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で解いてみた。