Googleの適正テストだそうです。しばし考えてみたのですが、面倒くさくなったので perlプログラムを作ってみました。
次の暗号を用いた等式を解け。
当然、MとEに該当する値は交換可能である。
数字の先頭に0は入らない。
WWWDOT - GOOGLE = DOTCOM
このプログラムはPentium 4 2.80CGHz PCで31秒かかりました。#!/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; } }
解説) 元々手で解こうとしたので、まず引き算から足し算に数式を変更。
DOTCOM+GOOGLE=WWWDOT
各数字の文字はゼロから始まらないということなので、D, G, Wは0以外。そのためループの開始を1からとします。他の文字は0から開始です。
各ループの中では、他の変数と同じ数字だった場合を除くための処理 { next; } を入れています。
以上でめでたく2つ答えが出てきます。その答えは問題の条件にあるようにM, Eが逆になったものです。