知恵袋の「ウソつき問題」をPythonで解いてみました。(^_^;
A~Eの5人で論争した結果、次のような、A、B、Cの発言があった。
A「Bはウソをついている」
B「Eはウソをついている」
C「Dはウソをついている」
以上の事ことから判断して確実にいえるのは、次のうちのどれか。
1 ウソつきは3人いる。
2 正直者は3人いる。
3 Bがウソつきであるとき、Dもウソつきである。
4 Eがウソつきであれば、ウソつきはもう2人いる。
5 Aが正直者ならば、Dも正直者である。
論理等価Eqvだけじゃなく、論理包含Impなど他にも色々、出て来て総合問題になっているようなので、ウソつき問題のまとめとして解いてみました。(^_^;
正直者をTrue、ウソつきをFalseとすると、「Bはウソをついている」は、「b==False」または、「not b」で表すことができます。
また、「Aは正直者」は、「a==True」または、「a」で表すことができます。
ちなみに、「ウソつきはもう2人いる」というのは、「ウソつきは全部で3人いる」ということですよね。(^_^;
それから、getRowOfTruthTable()関数等をリスト内包表記を使って書き直してみました。(^_^;
● Liar5.py
# coding: UTF-8 # Liar5.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 # 真理値表の1行を文字列で得る def getRowOfTruthTable(li): return ' '.join(['T' if b else 'F' for b in li]) # 確実にいえる選択肢を1つ得る def getAns(choices): fmt = '%s' if choices.count(True)==1 else 'Error! {%s}' return fmt%getTrue('12345',choices) def getTrue(s,li): return ','.join([s[i] for i in range(len(li)) if li[i]]) 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,not b): continue # b==False if not Eqv(b,not e): continue # e==False if not Eqv(c,not d): continue # d==False # チェックを潜り抜けたものだけを表示 cnt+=1 if cnt==1: print('[A B C D E]') print(' %s'%getRowOfTruthTable([a,b,c,d,e])) # 選択肢のチェック choices[0] &= (p.count(False)==3) choices[1] &= (p.count(True )==3) choices[2] &= Imp(not b,not d) # b==False, d==False choices[3] &= Imp(not e,p.count(False)==3) # e==False choices[4] &= Imp(a,d) # a==True, d==True print(u'∴%s'%getAns(choices)) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
●実行結果
[A B C D E] T F T F T T F F T T F T T F F F T F T F ∴4 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で解いてみた。(9) - rscのブログ
●OKWAVEの「ウソつき問題」をPythonで解いてみた。 - rscのブログ
●天使と悪魔と道化の「ウソつき問題」をPythonで解いてみた。 - rscのブログ
●知恵袋の「うそつき問題」をJavaで解いてみた。
●ネットで見つけた「うそつき問題」をJavaで解いてみた。
●ネットで見つけた「うそつき問題」を自分で解いてみた。
●2つの発言の「うそつき問題」をJavaで解いてみた。