知恵袋の「ウソつき問題」をPythonで解いてみました。(^_^;
A,B,C,D,E,さんのうち、何人かがうそつきで残りは正直者、5人に「あなたたちのうち、うそつきは何人いますか」と聞くと、下のように答えました。5人のうちうそつきは何人いますか。
A・1人 B・2人 C・3人 D・4人 E・5人
プログラムでは、正直者をTrue、うそつきをFalseとして、発言者と発言内容の論理等価Eqvをとってみました。(^_^;
ちなみに、「P Eqv Q」は、「not(P Xor Q)」と同じことです。
ここで、「P Xor Q」=「(P and not Q)or(not P and Q)」=「(P or Q)and not(P and Q)」ですが、簡単に、「P^Q」でもいいようです。(^_^;
● Liar1.py
# coding: UTF-8 # Liar1.py import itertools from time import time # 論理等価Eqv def Eqv(p,q): return not(p^q) # 真理値表の1行を文字列で得る def getRowOfTruthTable(lst): result = "" for b in lst: result += " T" if b else " F" return result def main(): tm = time() # Timer Start TF = (True,False) for p in itertools.product(TF,repeat=5): a,b,c,d,e = p if not Eqv(a,p.count(False)==1): continue if not Eqv(b,p.count(False)==2): continue if not Eqv(c,p.count(False)==3): continue if not Eqv(d,p.count(False)==4): continue if not Eqv(e,p.count(False)==5): continue # チェックを潜り抜けたものだけを表示 print('[A B C D E]') print(getRowOfTruthTable(p)) print(u'∴ %d人'%p.count(False)) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
●実行結果
[A B C D E] F F F T F ∴ 4人 Runtime : 0.001 [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で解いてみた。