花火大会の推理パズルをPythonで解いてみた。

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

 開催日日付:{7月20日,7月27日,8月03日,8月10日,8月17日}
 大 会 名:{す花火大会,か花火大会,え花火大会,あ花火大会,は花火大会}
 打ち上げ数:{9000発,1万発,1万2000発,1万5000発,2万発}
(ア) {え花火大会の開催日}={7月}
(イ) {7月20日の打ち上げ数}=1万5000[発]
(ウ) {あ花火大会の開催日}={8月10日}
(エ) {す花火大会の打ち上げ数}=2万[発]
(オ) {か花火大会の開催日}={8月},≠{8月03日}
(カ) {え花火大会の打ち上げ数}=9000[発]
(キ) {8月10日の打ち上げ数}≠1万[発]

 ただし、大会名が煩わしいので「先頭平仮名一文字」+「花火大会」に改名して、条件に(ア)〜(キ)と名前を付けました。また、プログラムでは、次のような略号や数値を用いました。

 開催日日付:(7月20日,7月27日,8月03日,8月10日,8月17日)
       =(100×{月}+{日})⇒(720,727,803,810,817)
 大 会 名:(す花火大会,か花火大会,え花火大会,あ花火大会,は花火大会)
       =(先頭一文字)⇒(す,か,え,あ,は)
 打ち上げ数:(9000発,1万発,1万2000発,1万5000発,2万発)
       =({打ち上げ数}/1000)⇒(9,10,12,15,20)

● fireworksFest1.py

# coding: UTF-8
# fireworksFest1.py

import itertools
from time import time

def toStr(n,lst):
    fmt = '%'+str(n)+'s'
    return '(%s)'%','.join([fmt%x for x in lst])

def main():
    tm = time() # Timer Start
    D = (720,727,803,810,817)    # 日付(100×{月}+{日}:固定)
    P = u'すかえあは'            # 大会名(先頭一文字)
    N = (9,10,12,15,20)          # 打ち上げ数(〃/1000)
    for p in itertools.permutations(P):
        if not D[p.index(u'え')]//100==7: continue       # 条件(ア)
        if not D[p.index(u'あ')]==810:    continue       # 条件(ウ)
        for n in itertools.permutations(N):
            if not n[D.index(720)]==15:       continue   # 条件(イ)
            if not n[p.index(u'す')]==20:     continue   # 条件(エ)
            if not D[p.index(u'か')]//100==8: continue   # 条件(オ-1)
            if not D[p.index(u'か')]!=803:    continue   # 条件(オ-2)
            if not n[p.index(u'え')]==9:      continue   # 条件(カ)
            if not n[D.index(810)]!=10:       continue   # 条件(キ)
            # チェックを潜り抜けたものだけを表示
            print(toStr(3,D))
            print(toStr(2,p))
            print(toStr(3,n))

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

if __name__ == '__main__':
    main()

●実行結果

(720,727,803,810,817)
( は, え, す, あ, か)
( 15,  9, 20, 12, 10)
Runtime : 0.000 [sec]

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









スーパー推理パズルDX (MSムック)

スーパー推理パズルDX (MSムック)