知恵袋の「ウソつき問題」をPythonで解いてみました。(^_^;
正直ものは常に正しいことを言い、うそつきは常にうそを言っているとすると、A~Dのち正直者はだれか。
A「Bはうそつきだ」
B「僕はうそつきじゃない。Cはうそつきだ」
C「僕はうそつきじゃない。Dはうそつきだ」
D「君たちは3人ともうそつきじゃないよ」
選択肢
1 AとB、2 AとC、3 AとD、4 BとC、5 BとD
「僕はうそつきじゃない」は正直者もうそつきも言うから参考にはならないだけじゃなく、ちょっと問題があるようです。
たとえば、「Eqv(a,a!=False and ~)」で、「a==False ならば、and以降に無関係に真になってしますので、「a!=False」は省略するか、「Eqv(a,a!=False)」と「Eqv(a,~)」のように分けないといけないようです。(^_^;
それから、「aはウソつきである」等は、次のように書き換えてもいいようです。
「aはウソつきである」 ≡「a==False」≡「not a」
「aはウソつきではない」≡「a!=False」≡「not(not a)」≡「a」
「aは正直者である」 ≡「a==True」 ≡「a」
P.S.
a | a==True | not a | a==False | not(not a) | a!=False |
---|---|---|---|---|---|
True | True | False | False | True | True |
False | False | True | True | False | False |
ちなみに、「if not Eqv(b,b)」と「「if not Eqv(c,c)」」は必ずFalseになるのが明らかなので、コメントアウトしました。(^_^;
● Liar4.py
# coding: UTF-8 # Liar4.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 getHonestMen(name,li): result = [] for i in range(len(li)): if li[i]: result.append(name[i]) return ','.join(result) def main(): tm = time() # Timer Start TF = (True,False) cnt = 0 for p in itertools.product(TF,repeat=4): a,b,c,d = p if not Eqv(a,not b): continue # b==False ## if not Eqv(b, b): continue # b!=False if not Eqv(b,not c): continue # c==False ## if not Eqv(c, c): continue # c!=False if not Eqv(c,not d): continue # d==False if not Eqv(d,a and b and c): continue # a==b==c!=False # チェックを潜り抜けたものだけを表示 cnt+=1 if cnt==1: print('[A B C D]') print('%s'%getRowOfTruthTable([a,b,c,d])) print(u'∴正直者: %s'%getHonestMen('ABCD',p)) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
●実行結果
[A B C D] T F T F ∴正直者: A,C 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で解いてみた。(8) - rscのブログ
●知恵袋の「ウソつき問題」をPythonで解いてみた。(9) - rscのブログ
●OKWAVEの「ウソつき問題」をPythonで解いてみた。 - rscのブログ
●天使と悪魔と道化の「ウソつき問題」をPythonで解いてみた。 - rscのブログ
●知恵袋の「うそつき問題」をJavaで解いてみた。
●ネットで見つけた「うそつき問題」をJavaで解いてみた。
●ネットで見つけた「うそつき問題」を自分で解いてみた。
●2つの発言の「うそつき問題」をJavaで解いてみた。