知恵袋の「ウソつき問題」をPythonで解いてみました。(^_^;
A~Eの5人が次のように発言している
A「Bはウソつきだ」
B「Cはウソつきではない」
C「D.Eはどちらもウソつきだ」
D「Eはウソつきだ」
E「私はウソつきではない」
5人のうち、何人かがウソをついている。このとき確実にいえることはどれか。
選択肢
1、Aはウソつきである
2、Bはウソつきである
3、Cはウソつきではない
4、Dはウソつきである
5、Eはウソつきではない
自分で解くとすれば、GW法を用いるようです。
ちなみに、「僕はうそつきじゃない」は正直者もうそつきも言うから参考にはならない、そうです。コメントアウトしても同じ結果を得ます。(^_^;
● Liar3.py
# coding: UTF-8 # Liar3.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 choices = [True]*5 TF = (True,False) cnt = 0 for p in itertools.product(TF,repeat=5): a,b,c,d,e = p if not Eqv(a,b==False): continue if not Eqv(b,c!=False): continue if not Eqv(c,d==False and e==False): continue if not Eqv(d,e==False): continue if not Eqv(e,e!=False): continue # チェックを潜り抜けたものだけを表示 cnt+=1 if cnt==1: print('[A B C D E]') print('%s'%getRowOfTruthTable([a,b,c,d,e])) # 選択肢のチェック choices[0] &= (a==False) choices[1] &= (b==False) choices[2] &= (c!=False) choices[3] &= (d==False) choices[4] &= (e!=False) s = "" if cnt==0: choices = [False]*5 for c in choices: if c : s+=" %s"%(choices.index(c)+1) print(u"∴%s"%s) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
●実行結果
[A B C D E] T F F T F T F F F T ∴ 2 Runtime : 0.000 [sec]
※参考URL
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1121910336
●ウソつき問題と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で解いてみた。