買い物の推理パズルをPythonで解いてみた。

 ネットで見つけた買い物の推理パズルの問題Pythonで解いてみました。(^_^;
 拙ブログで「論理パズル」と呼んでいたものは、クイズ雑誌等では「推理パズル」と呼ばれているようです。(^_^;
 問題の概要を記号や式で表してみると、次の通りです。

 須山,瀬川,久保田,林,水野の5人が別々の物(懐炉,マスク,消臭剤,歯ブラシ,ティッシュ)を買いました。値段もすべて別(150円,180円,200円,230円,250円)です。
(ア) {須山が買った物}≠{歯ブラシ}
(イ) {水野が買った物}≠{懐炉}
(ウ) {久保田が買った物の値段}={マスクの値段}+20[円]
(エ) {林が買った物}={消臭剤}
(オ) {水野が買った物の値段}={歯ブラシの値段}-30[円]

 ただし、条件に(ア)〜(オ)と名前を付けました。また、プログラムでは、次のような略号を使いました。

 名 前 :(須山,瀬川,久保田,林,水野)=(須,瀬,久,林,水)
 買った物:(懐炉,マスク,消臭剤,歯ブラシ,ティッシュ)=(懐,マ,消,歯,テ)

● Shopping1.py

# coding: UTF-8
# Shopping1.py

from time import time
import itertools

def main():
    tm = time()  # Timer Start
    N = u'須瀬久林水'           # 名前(固定)
    G = u'懐マ消歯テ'           # 買った物
    P = (150,180,200,230,250)   # 値段
    for g in itertools.permutations(G):
        if g[N.index(u'須')]==u'歯': continue                     # 条件(ア)
        if g[N.index(u'水')]==u'懐': continue                     # 条件(イ)
        if g[N.index(u'林')]!=u'消': continue                     # 条件(エ)
        for p in itertools.permutations(P):
            if p[N.index(u'久')]!=p[g.index(u'マ')]+20: continue  # 条件(ウ)
            if p[N.index(u'水')]!=p[g.index(u'歯')]-30: continue  # 条件(オ)
            # チェックを潜り抜けたものだけを表示
            print('[ %s ]'%',  '.join(N))
            print('( %s )'%',  '.join(g))
            print(p)

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

if __name__ == '__main__':
    main()

●実行結果

[ 須,  瀬,  久,  林,  水 ]
( マ,  歯,  懐,  消,  テ )
(230, 180, 250, 200, 150)
Runtime : 0.000 [sec]

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