天使と悪魔と道化の「ウソつき問題」をPythonで解いてみました。(^_^;
ここに天使と悪魔と道化がいます。天使は常に真実を述べ、悪魔は常に嘘を述べます。道化は真実も嘘も意味不明のことも言うことがあります。
A「Bが天使なら私は悪魔です」
B「Aが悪魔なら私は天使です」
C「Bは天使ではありません」
と3人は言いました。
A,B,Cはそれぞれ天使、悪魔、道化のいずれとなりますか?
ただし、問題文を一部、書き直しました。
天使をU、悪魔をV、道化をWとしました。
「if not Imp(a!='W',Eqv(a=='U',Imp(b=='U',a=='V'))): continue」は、次のようにしてもいいです。(^_^;
if a!='W': if not Eqv(a=='U',Imp(b=='U',a=='V')): continue
ちなみに、論理包含Impの真理値表は次のようになりますので、前件が偽なら、後件が真でも偽でも、全体としては真になる、つまり、嘘にはならないことに注意しましょう。(^_^;
+---+---+-------+ | p | q |p Imp q| +---+---+-------+ | T | T | T | +---+---+-------+ | T | F | F | +---+---+-------+ | F | T | T | +---+---+-------+ | F | F | T | +---+---+-------+
ただし、Tは真、Fは偽とします。
● Liar11.py
# coding: UTF-8 # Liar11.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 = {'U':'天使', 'V':'悪魔', 'W':'道化'} P = 'UVW' for p in itertools.permutations(P): a,b,c = p if not Imp(a!='W',Eqv(a=='U',Imp(b=='U',a=='V'))): continue if not Imp(b!='W',Eqv(b=='U',Imp(a=='V',b=='U'))): continue if not Imp(c!='W',Eqv(c=='U',b!='U')): 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
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11143182656
●知恵袋の「ウソつき問題」を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のブログ