Googleと言えば、Pythonということで、昨日、Javaで作ったプログラムをPythonに翻訳してみました。やっぱり、楽だね。(^_^;
ただし、プログラム名を10Puzzleに改名しました。また、同じものを含む順列の場合、実行結果が重複してしまうので、発見した解を記録しておいて既出のものは表示しないようにしました。(^_^;
● 10Puzzle.py
# coding: UTF-8 # 10Puzzle.py import itertools from time import time def delSpace(s): return(s.replace(" ","")) def delBracket(s): r = s[:] iLen = len(r) for i in range(0,iLen): if r[i]!='(': continue c = 0 for j in range(i+1,iLen): if r[j]=='(': c+=1 elif r[j]==')': c-=1 if c>=0: continue r = r[:i]+' '+r[i+1:j]+' '+r[j+1:] # ()を外す if eval(s)!=eval(r): r = r[:i]+'('+r[i+1:j]+')'+r[j+1:] # 駄目なら戻す break return(delSpace(r)) def main(): tm=time() # Timer Start NUM = '1158' OPR = '+-*/' BRACKET = [ "(%s.0%s(%s.0%s(%s.0%s%s.0)))", "(%s.0%s((%s.0%s%s.0)%s%s.0))", "((%s.0%s%s.0)%s(%s.0%s%s.0))", "((%s.0%s(%s.0%s%s.0))%s%s.0)", "(((%s.0%s%s.0)%s%s.0)%s%s.0)"] sAns = "" # 発見した解の記録用 for o in itertools.product(OPR,repeat=3): # o loop for n in itertools.permutations(NUM): # n loop for b in BRACKET: # b loop sExpr = b % (n[0],o[0],n[1],o[1],n[2],o[2],n[3]) try: if eval(sExpr)==10.0: sExpr = delBracket(sExpr).replace('.0', '') if sAns.find(sExpr)==-1: # 既出でなければ表示 print(sExpr+'=10') sAns += sExpr+'|' # 発見した解を記録 except: continue tm=time()-tm # Timer Stop print("Runtime : %.3f [sec]"%tm) if __name__ == '__main__': main()
●実行結果
8/(1-1/5)=10 Runtime : 0.253 [sec]
※参考URL
●10.1. itertools ー 効率的なループ実行のためのイテレータ生成関数
●文字列操作の比較表: Ruby, Python, JavaScript, Perl, C++ - bkブログ
●10 Puzzleを解くプログラムをJavaで作ってみた。
●10 Puzzleを解くプログラムをPythonで作ってみた。 (2)
●10 Puzzleを解くプログラムをPythonで作ってみた。 (3)
- 作者: 辻真吾
- 出版社/メーカー: 技術評論社
- 発売日: 2010/04/24
- メディア: 大型本
- 購入: 19人 クリック: 199回
- この商品を含むブログ (59件) を見る
- 作者: 柴田淳
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2012/08/25
- メディア: 単行本
- 購入: 1人 クリック: 13回
- この商品を含むブログ (41件) を見る
パーフェクトPython (PERFECT SERIES 5)
- 作者: Pythonサポーターズ,露木誠,ルイス・イアン,石本敦夫,小田切篤,保坂翔馬,大谷弘喜
- 出版社/メーカー: 技術評論社
- 発売日: 2013/03/05
- メディア: 大型本
- 購入: 1人 クリック: 65回
- この商品を含むブログ (30件) を見る