Googleの入社試験の覆面算をPythonで解いてみた。

 Googleの入社試験の覆面算Pythonで解いてみました。(^_^;

WWWDOT - GOOGLE = DOTCOM

 Googleといえば、PythonということでPythonで解いてみました。SendMoreMoneyのときは、Rubyの方がちょっと速かったのでこれもたぶんRubyの方がちょっと速いかも知れません。(^_^;
 ちなみに、JavaScriptでは、0.6[sec]ぐらいでした。o(^-^)o

● WWWDOT-GOOGLE=DOTCOM.py

# coding: UTF-8
# WWWDOT-GOOGLE=DOTCOM.py

import itertools
from time import time

def main():
    tm = time()     # Timer Start

    P = range(10)
    cnt = 0
    for p in itertools.permutations(P,9):
        W,D,O,T,G,L,E,C,M = p
        if W*G*D==0: continue
        if G+D!=W and G+D+1!=W: continue
        if (E+M)%10!=T: continue
        WWWDOT = 100000*W+10000*W+1000*W+100*D+10*O+T
        GOOGLE = 100000*G+10000*O+1000*O+100*G+10*L+E
        DOTCOM = 100000*D+10000*O+1000*T+100*C+10*O+M
        if WWWDOT-GOOGLE!=DOTCOM: continue
        # チェックを潜り抜けたものだけを表示
        cnt+=1
        print("[%d]"%cnt)
        print(" WWWDOT %s"%WWWDOT)
        print("-GOOGLE %s"%GOOGLE)
        print("-------")
        print(" DOTCOM %s"%DOTCOM)

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

if __name__ == '__main__':
    main()

●実行結果

[1]
 WWWDOT 777589
-GOOGLE 188103
-------
 DOTCOM 589486
[2]
 WWWDOT 777589
-GOOGLE 188106
-------
 DOTCOM 589483
Runtime : 2.106 [sec]

※参考URL
SEND MORE MONEY in Python(2) - rscの日記
SEND MORE MONEY in Ruby(2) - rscの日記

P.S.
 ちょっと工夫したらかなり高速化しました。(^_^;

● WWWDOT-GOOGLE=DOTCOM1.py

# coding: UTF-8
# WWWDOT-GOOGLE=DOTCOM1.py

import itertools
from time import time

def main():
    tm = time()     # Timer Start

    P = range(10)
    Q = range(1,10)
    cnt = 0
    for q in itertools.permutations(Q,3):
        W,G,D = q
        if G+D!=W and G+D+1!=W: continue
        R = list(set(P)-set(q))
        for p in itertools.permutations(R,6):
            O,T,L,E,C,M = p
            if (E+M)%10!=T: continue
            WWWDOT = 100000*W+10000*W+1000*W+100*D+10*O+T
            GOOGLE = 100000*G+10000*O+1000*O+100*G+10*L+E
            DOTCOM = 100000*D+10000*O+1000*T+100*C+10*O+M
            if WWWDOT-GOOGLE!=DOTCOM: continue
            # チェックを潜り抜けたものだけを表示
            cnt+=1
            print("[%d]"%cnt)
            print(" WWWDOT %s"%WWWDOT)
            print("-GOOGLE %s"%GOOGLE)
            print("-------")
            print(" DOTCOM %s"%DOTCOM)

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

if __name__ == '__main__':
    main()

●実行結果

[1]
 WWWDOT 777589
-GOOGLE 188103
-------
 DOTCOM 589486
[2]
 WWWDOT 777589
-GOOGLE 188106
-------
 DOTCOM 589483
Runtime : 0.140 [sec]