SEND MORE MONEY in Python(3)

 昨日のGoogleの覆面算がちょっと工夫したらかなり高速化したので、以前作ったSend More Moneyプログラムにも同様の工夫をして改良してみました。
 先頭の文字が0になったらスキップするんじゃなくて、初めから0にならないように順列生成のリストから0をはずしたり、先頭と末尾の桁で枝狩りしてみました。中間の桁でやってもそれ程効果がなくソースが複雑化するので省きました。(^_^;
 というか、コメントアウトしているのを元に戻すと逆に遅くなるようです。(^_^;
 最近は、PCのスピードが速くなりすぎて、Cで作ると、改良しても、たいして差がないのですが、Pythonだとちょっと改良すると、すぐ結果に反映するのでやりがいがありますね。(^_^;

● SendMoreMoney3.py

# coding: UTF-8
# SendMoreMoney3.py

import itertools
from time import time

def main():
    tm=time()  # Timer Start
    P = range(10)
    for p in itertools.permutations(P[1:],2):
        s,m = p
        if (0+0)%10!=m and (0+0+1)%10!=m: continue
        Q = list(set(P)-set(p))
        for q in itertools.permutations(Q,6):
            e,n,d,o,r,y = q
##            if (s+m)%10!=o and (s+m+1)%10!=o: continue
##            if (e+o)%10!=n and (e+o+1)%10!=n: continue
##            if (n+r)%10!=e and (n+r+1)%10!=e: continue
            if (d+e)%10!=y: continue
            send  =         1000*s+100*e+10*n+d
            more  =         1000*m+100*o+10*r+e
            money = 10000*m+1000*o+100*n+10*e+y
            if send+more!=money: continue
            # チェックを潜り抜けたものだけを表示
            print("  "+str(send))
            print(" +"+str(more))
            print("-------")
            print(" "+str(money))
            print("")

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

if __name__ == '__main__':
    main()

●実行結果

  9567
 +1085
-------
 10652

Runtime : 0.062 [sec]

※参考URL
SEND MORE MONEY C言語プログラム - rscの日記
SEND MORE MONEY(2) C++ - rscの日記
SEND MORE MONEY(3) C言語プログラム - rscの日記
SEND MORE MONEY JavaScriptプログラム - rscの日記
SEND MORE MONEY in Java - rscの日記
SEND MORE MONEY in Python - rscの日記
SEND MORE MONEY in Ruby - rscの日記
SEND MORE MONEY in Python(2) - rscの日記
SEND MORE MONEY in Ruby(2) - rscの日記