昼食の推理パズルをPythonで解いてみた。

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









絶賛推理パズル MS (MSムック)

絶賛推理パズル MS (MSムック)