タワーの推理パズルをPythonで解いてみた。

 ネットで見つけたタワーの推理パズルの問題Pythonで解いてみました。(^_^;
 問題の概要を記号や式で表すと、次の通りです。

 タワー:{五稜郭タワー,東京タワー,スカイツリー,京都タワー,通天閣}
 同行者:{イツキ,ツトム,ジュンジ,シンジ,ヨシアキ}
  月 :{2月,3月,8月,9月,12月}
 天 気:{快晴,晴れ,曇り,雨,雪}
(ア) {ヨシアキ}={五稜郭タワー}={雪}
(イ) {9月}={ジュンジ}={雨}
(ウ) {シンジ}={京都タワー}={12月}
(エ) {ツトム}={晴れ}
(オ) {快晴}≠{イツキ}
(カ) {ツトム}≧{7月}
(キ) {通天閣}={2月}
(ク) {ジュンジ}≠{東京タワー}

 ただし、等号「=」は数学的な意味ではなく、対応関係(リストの要素と見たときにインデックスが等しいこと)を記号的に表しています。それから、条件に(ア)〜(ク)と名前を付けました。また、プログラムでは、次のような略号や数値を用いました。

 タワー:(五稜郭タワー,東京タワー,スカイツリー,京都タワー,通天閣)
    ⇒(五,東,ス,京,通)
 同行者:(イツキ,ツトム,ジュンジ,シンジ,ヨシアキ)⇒(イ,ツ,ジ,シ,ヨ)
  月 :(2月,3月,8月,9月,12月)⇒( 2, 3, 8, 9,12)
 天 気:(快晴,晴れ,曇り,雨,雪)⇒(快,晴,曇,雨,雪)

 ちなみに、プログラムで、
「if not c.index(u'ヨ')==T.index(u'五')==w.index(u'雪'): continue」は、
「if not c.index(u'ヨ')==T.index(u'五'): continue」と
「if not T.index(u'五')==w.index(u'雪'): continue」などに分けて、
前者を c loop のところに持ってきた方が速くなりますが、Pythonには、2つの等号を一度に比較できる機能があって、これを一度使ってみたかったので敢えてこういう書き方をしてみました。(^_^;

● Tower1.py

# coding: UTF-8
# Tower1.py

import itertools
from time import time

def toStr(lst):
    fmt = '%s'
    return '(%s)'%'\t'.join([fmt%x for x in lst])

def main():
    tm = time() # Timer Start
    T = u'五東ス京通'    # タワー(固定)
    C = u'イツジシヨ'    # 同行者
    M = (2,3,8,9,12)     # 月
    W = u'快晴曇雨雪'    # 天気
    for c in itertools.permutations(C):
        if not c.index(u'ジ')!=T.index(u'東'): continue           # 条件(ク)
        for m in itertools.permutations(M):
            if not c.index(u'シ')==T.index(u'京')==m.index(12):
                continue                                          # 条件(ウ)
            if not m[c.index(u'ツ')]>=7: continue                 # 条件(カ)
            if not T.index(u'通')==m.index( 2): continue          # 条件(キ)
            for w in itertools.permutations(W):
                if not c.index(u'ヨ')==T.index(u'五')==w.index(u'雪'):
                    continue                                      # 条件(ア)
                if not m.index( 9)   ==c.index(u'ジ')==w.index(u'雨'):
                    continue                                      # 条件(イ)
                if not c.index(u'ツ')==w.index(u'晴'): continue   # 条件(エ)
                if not c.index(u'イ')==w.index(u'快'): continue   # 条件(オ)
                # チェックを潜り抜けたものだけを表示
                print(toStr(T))
                print(toStr(c))
                print(toStr(m))
                print(toStr(w))

    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

(五     東      ス      京      通)
(ヨ     ツ      ジ      シ      イ)
(3      8       9       12      2)
(雪     晴      雨      曇      快)
Runtime : 0.016 [sec]

※参考URL
買い物の推理パズルをPythonで解いてみた。
去年と今年の身長の推理パズルをPythonで解いてみた。
花火大会の推理パズルをPythonで解いてみた。
昼食の推理パズルをPythonで解いてみた。
買い物の推理パズルをPythonで解いてみた。(2)
願い事の推理パズルをPythonで解いてみた。









オール推理マトリックスベストコレクション (MSムック)

オール推理マトリックスベストコレクション (MSムック)