知恵袋の「ウソつき問題」をPythonで解いてみた。(9)

 知恵袋の「ウソつき問題」を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で解いてみた。