WWWDOT-GOOGLE=DOTCOM

Googleの適正テストだそうです。

次の暗号を用いた等式を解け。
当然、MとEに該当する値は交換可能である。
数字の先頭に0は入らない。
WWWDOT - GOOGLE = DOTCOM
しばし考えてみたのですが、面倒くさくなったので perlプログラムを作ってみました。
#!/usr/bin/perl
                                         
for( $d = 1; $d < 10; $d++ ){
    for( $g = 1; $g < 10; $g++ ){
        if( $g == $d ) { next; }
        for( $w = 1; $w < 10; $w++ ){
            if( $w == $d ) { next; }
            if( $w == $g ) { next; }
            for( $o = 0; $o < 10; $o++ ){
                if( $o == $d ) { next; }
                if( $o == $g ) { next; }
                if( $o == $w ) { next; }
                for( $t = 0; $t < 10; $t++ ){
                    if( $t == $d ) { next; }
                    if( $t == $g ) { next; }
                    if( $t == $w ) { next; }
                    if( $t == $o ) { next; }
                    for( $l = 0; $l < 10; $l++ ){
                        if( $l == $d ) { next; }
                        if( $l == $g ) { next; }
                        if( $l == $w ) { next; }
                        if( $l == $o ) { next; }
                        if( $l == $t ) { next; }
                        for( $e = 0; $e < 10; $e++ ){
                            if( $e == $d ) { next; }
                            if( $e == $g ) { next; }
                            if( $e == $w ) { next; }
                            if( $e == $o ) { next; }
                            if( $e == $t ) { next; }
                            if( $e == $l ) { next; }
                            for( $c = 0; $c < 10; $c++ ){
                                if( $c == $d ) { next; }
                                if( $c == $g ) { next; }
                                if( $c == $w ) { next; }
                                if( $c == $o ) { next; }
                                if( $c == $t ) { next; }
                                if( $c == $l ) { next; }
                                if( $c == $e ) { next; }
                                for( $m = 0; $m < 10; $m++ ){
                                    if( $m == $d ) { next; }
                                    if( $m == $g ) { next; }
                                    if( $m == $w ) { next; }
                                    if( $m == $o ) { next; }
                                    if( $m == $t ) { next; }
                                    if( $m == $l ) { next; }
                                    if( $m == $e ) { next; }
                                    if( $m == $c ) { next; }
                                    &calc;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

sub calc
{
    my $sum, $dotcom, $google, $wwwdot;
    $dotcom = $d * 100000 + $o * 10000 + $t * 1000 + $c * 100 + $o * 10 + $m;
    $google = $g * 100000 + $o * 10000 + $o * 1000 + $g * 100 + $l * 10 + $e;
    $wwwdot = $w * 100000 + $w * 10000 + $w * 1000 + $d * 100 + $o * 10 + $t;

    if( $dotcom + $google == $wwwdot ){
        print "$dotcom + $google = $wwwdot\n";
        return 0;
    }
    else{
        return 1;
    }
}
このプログラムはPentium 4 2.80CGHz PCで31秒かかりました。

解説) 元々手で解こうとしたので、まず引き算から足し算に数式を変更。

DOTCOM+GOOGLE=WWWDOT
各数字の文字はゼロから始まらないということなので、D, G, Wは0以外。そのためループの開始を1からとします。他の文字は0から開始です。
各ループの中では、他の変数と同じ数字だった場合を除くための処理 { next; } を入れています。
以上でめでたく2つ答えが出てきます。その答えは問題の条件にあるようにM, Eが逆になったものです。