ネットで見つけた昼食の推理パズルの問題をPythonで解いてみました。(^_^;
問題の概要を記号や式で表すと、次の通りです。
予算:{400円,600円,800円,1000円}
名前:{春美(女),夏人(男),秋絵(女),冬彦(男)}
種類:{手作り弁当,社員食堂,立食レストラン,コンビニ弁当}
(ア) {男性組の予算の合計}={女性組の予算の合計}
(イ) {弁当組}={男女のカップル}
(ウ) {夏人の昼食の予算}=800[円], {夏人の昼食}≠{コンビニ弁当}
(エ) {春美の昼食の予算}=400[円], {春美の昼食}={手作り弁当}
(オ) {社員食堂を使う人の予算}≠1000[円]
ただし、等号「=」は対応関係などを記号的に表しています。それから、条件に(ア)〜(オ)と名前を付けました。また、プログラムでは、次のような略号や数値を用いました。
予算:(400円,600円,800円,1000円)⇒(400,600,800,1000)
名前:(春美,夏人,秋絵,冬彦)⇒(春,夏,秋,冬)
種類:(手作り弁当,社員食堂,立食レストラン,コンビニ弁当)⇒(手,社,立,コ)
条件(イ)は、getSex()関数で男女表を作成して調べました。
● Lunch1.py
# coding: UTF-8 # Lunch1.py from time import time import itertools def toStr(lst): fmt = '%s' return '(%s)'%'\t'.join([fmt%x for x in lst]) # 性別を取得 def getSex(s): return 'M' if s in u'夏冬' else 'F' def main(): tm = time() # Timer Start B = (400,600,800,1000) # 予算(固定) N = u'春夏秋冬' # 名前 S = u'手社立コ' # 種類 for n in itertools.permutations(N): Sm = B[n.index(u'夏')]+B[n.index(u'冬')] # 男性組の予算の合計 Sf = B[n.index(u'春')]+B[n.index(u'秋')] # 女性組の予算の合計 if not Sm==Sf: continue # 条件(ア) for s in itertools.permutations(S): t = getSex(n[s.index(u'手')])+getSex(n[s.index(u'コ')]) # 男女表 if not set(t)==set('MF'): continue # 条件(イ) if not n.index(u'夏')==B.index(800)!=s.index(u'コ'): # 条件(ウ) continue if not n.index(u'春')==B.index(400)==s.index(u'手'): # 条件(エ) continue if not B[s.index(u'社')]!=1000: continue # 条件(オ) # チェックを潜り抜けたものだけを表示 print(toStr(B)) print(toStr(n)) print(toStr(s)) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
●実行結果
(400 600 800 1000) (春 冬 夏 秋) (手 コ 社 立) Runtime : 0.000 [sec]
※参考URL
●買い物の推理パズルをPythonで解いてみた。
●去年と今年の身長の推理パズルをPythonで解いてみた。
●花火大会の推理パズルをPythonで解いてみた。
●タワーの推理パズルをPythonで解いてみた。
●買い物の推理パズルをPythonで解いてみた。(2)
●願い事の推理パズルをPythonで解いてみた。
- 作者: 大石禎
- 出版社/メーカー: メディアソフト
- 発売日: 2013/03/27
- メディア: 単行本
- この商品を含むブログ (1件) を見る