ネットで見つけた買い物の推理パズルの問題を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で解いてみた。