OKWAVEの「ウソつき問題」をPythonで解いてみました。(^_^;
ある一人の子供を見てA~Eの5人が次のように発言した。
A「赤い上着を着ている」
B「青い帽子をかぶっている」
C「白いズボンをはいている」
D「茶色のクツを履いている」
E「黒いズボンをはいている」
さらに、これらの発言についてそれぞれが次のように発言した。
A「Dはうそをついている」
B「Cはうそをついている」
C「うそをついているのは2人いる」
D「Bはうそをついている」
E「Aはうそをついている」
嘘をついている人は2つの発言とも嘘をついている。
このときのA~Eの発言の真偽について正しいのはどれか。
1つ目の発言のチェックは、「for j」~「for s」のループの代わりに、GW法から、cとeの発言の対立に着目して、「if not Imp(c,not e): continue」としてもよいです。(^_^;
● Liar10.py
# coding: UTF-8 # Liar10.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 toStr(li): return '[%s]'%','.join(li) # 真理値表の1行を文字列で得る def getRowOfTruthTable(li): return ' '.join(['T' if b else 'F' for b in li]) def main(): tm = time() # Timer Start TF = (True,False) for p in itertools.product(TF,repeat=5): a,b,c,d,e = p # 2つ目の発言のチェック if not Eqv(a,not d): continue if not Eqv(b,not c): continue if not Eqv(c,p.count(False)==2): continue if not Eqv(d,not b): continue if not Eqv(e,not a): continue # 1つ目の発言のチェック for j in 'Ro': # j:上着 (R:赤; o:その他) for h in 'Bo': # h:帽子 (B:青; o:その他) for t in 'BWo': # t:ズボン(B:黒; W:白; o:その他) for s in 'Bo': # s:靴 (B:茶; o:その他) if not Eqv(a,j=='R'): continue if not Eqv(b,h=='B'): continue if not Eqv(c,t=='W'): continue if not Eqv(d,s=='B'): continue if not Eqv(e,t=='B'): continue pass # チェックを潜り抜けたものだけを表示 print('[A B C D E]') print(' %s'%getRowOfTruthTable(p)) print('[j,h,t,s] = %s'%toStr([j,h,t,s])) ## if not Imp(c,not e): continue ## print('[A B C D E]') ## print(' %s'%getRowOfTruthTable(p)) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
●実行結果
[A B C D E] T T F F F [j,h,t,s] = [R,B,o,o] Runtime : 0.000 [sec]
※参考URL
●ウソつき問題とGW法 - PSM
●知恵袋の「ウソつき問題」を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で解いてみた。