昨日の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の日記