10 Puzzleを解くプログラムをPythonで作ってみた。 (2)

 前回のプログラムを0000〜9999まで、すべての解を求めるように書き直してみました。約3分ぐらいかかるようです。
 括弧付けで外側の括弧は初めから外してみました。(^_^;
 ちなみに、IDEとして、PyScripterを使いました。

● 10PuzzleAll.py

# coding: UTF-8
# 10PuzzleAll.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 = '0123456789'
    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"]
    for m in itertools.product(NUM,repeat=4):       # m loop
        if not(m[0]<=m[1]<=m[2]<=m[3]) : continue
        print("<<--- "+"".join(m)+" --->>")
        sAns = ""    # 発見した解の記録用
        for o in itertools.product(OPR,repeat=3):   # o loop
            for n in itertools.permutations(m):     # 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()

●実行結果

<<---  0000  --->>
<<---  0001  --->>
<<---  0002  --->>

…(省略)…

<<---  8999  --->>
8+(9+9)/9=10
(9+9)/9+8=10
<<---  9999  --->>
(9+9*9)/9=10
(9*9+9)/9=10
Runtime : 183.574 [sec]

※参考URL
10 Puzzleを解くプログラムをJavaで作ってみた。
10 Puzzleを解くプログラムをPythonで作ってみた。
10 Puzzleを解くプログラムをPythonで作ってみた。 (3)

Pythonスタートブック

Pythonスタートブック

みんなのPython 第3版

みんなのPython 第3版

パーフェクトPython (PERFECT SERIES 5)

パーフェクトPython (PERFECT SERIES 5)