知恵袋の「ウソつき問題」をPythonで解いてみました。(^_^;
P、Q、R、S、Tの5人が100メートル競走をした。その結果について5人が以下のように話した。ただし本当のことを言っているのは1位の人だけで、残りの4人は嘘をついている。同じ順位の者はいなかったとしてPの順位を答えよ。
P「僕はQより順位が上だった。」
Q「Sが1位だった。」
R「Sが5位だった。」
S「僕は5位ではない。」
T「僕はPより順位が上だった。」
ウソつき問題と順序問題の融合問題のようです。(^_^;
「{発言者}=={1位の人}」で発言者が正直者かどうかを判定しました。
● Liar9.py
# coding: UTF-8 # Liar9.py import itertools from time import time # 論理等価Eqv def Eqv(p,q): return not(p^q) def toStr(li): return '[%s]'%','.join(li) def main(): tm = time() # Timer Start P = 'PQRST' # 選手 for p in itertools.permutations(P): f = p[0] # 1位の人 if not Eqv('P'==f,p.index('P')< p.index('Q')): continue if not Eqv('Q'==f,'S'==f): continue if not Eqv('R'==f,p.index('S')+1==5): continue if not Eqv('S'==f,p.index('S')+1!=5): continue if not Eqv('T'==f,p.index('T')< p.index('P')): continue pass # チェックを潜り抜けたものだけを表示 print(toStr(p)) print(u'∴%d位'%(p.index('P')+1)) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
●実行結果
[R,Q,P,T,S] ∴3位 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で解いてみた。