ネットで見つけた花火大会の推理パズルの問題を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で解いてみた。
- 出版社/メーカー: メディアソフト
- 発売日: 2013/08/19
- メディア: 雑誌
- この商品を含むブログ (1件) を見る