原稿が終わったので、ビールを飲みながら、読売新聞日曜版の阿刀田高氏の推理エッセイに出ていた、もう1問の推理パズルに挑戦してみることにした。その問題は次のようなもの。それぞれの英字に数字を当てはめ、数式を成立させよ、という問題だ。

  SEND
+ MORE
−−−−−−
 MONEY

 これもBASICのプログラムを書けばチョロイだろうと思って、作成したのが次のプログラム。



CLS 0
BEEP
s = 0: e = 0: n = 0: d = 0
m = 0: o = 0: r = 0:
y = 0

FOR s = 8 TO 9
FOR e = 0 TO 9
FOR n = 0 TO 9
FOR d = 0 TO 9
FOR o = 0 TO 9
FOR r = 0 TO 9
FOR y = 0 TO 9
m = 1

t1 = (s * 1000 + e * 100 + n * 10 + d)
t2 = (m * 1000 + o * 100 + r * 10 + e)
t3 = (m * 10000 + o * 1000 + n * 100 + e * 10 + y)

IF t1 < 1000 GOTO nextx
IF t2 < 1000 GOTO nextx
IF t3 <> t1 + t2 GOTO nextx

IF s = e GOTO nextx
IF s = n GOTO nextx
IF s = d GOTO nextx
IF s = m GOTO nextx
IF s = o GOTO nextx
IF s = r GOTO nextx
IF s = y GOTO nextx

IF e = s GOTO nextx
IF e = n GOTO nextx
IF e = d GOTO nextx
IF e = m GOTO nextx
IF e = o GOTO nextx
IF e = r GOTO nextx
IF e = y GOTO nextx

IF n = s GOTO nextx
IF n = e GOTO nextx
IF n = d GOTO nextx
IF n = m GOTO nextx
IF n = o GOTO nextx
IF n = r GOTO nextx
IF n = y GOTO nextx

IF d = s GOTO nextx
IF d = e GOTO nextx
IF d = n GOTO nextx
IF d = m GOTO nextx
IF d = o GOTO nextx
IF d = r GOTO nextx
IF d = y GOTO nextx

IF o = s GOTO nextx
IF o = e GOTO nextx
IF o = n GOTO nextx
IF o = d GOTO nextx
IF o = m GOTO nextx
IF o = r GOTO nextx
IF o = y GOTO nextx

IF r = s GOTO nextx
IF r = e GOTO nextx
IF r = n GOTO nextx
IF r = d GOTO nextx
IF r = m GOTO nextx
IF r = o GOTO nextx
IF r = y GOTO nextx

IF y = s GOTO nextx
IF y = e GOTO nextx
IF y = n GOTO nextx
IF y = d GOTO nextx
IF y = m GOTO nextx
IF y = o GOTO nextx
IF y = r GOTO nextx

BEEP: BEEP: BEEP

PRINT
PRINT "    s="; s; " e="; e; " n="; n; " d="; d
PRINT "    m="; m; " o="; o; " r="; r; " e="; e
PRINT "m="; m; " o="; o; " n="; n; " e="; e; " y="; y

INPUT "Hit Return:"; a$
IF a$ <> "" GOTO nextx

nextx:
PRINT s; e; n; d; "/"; m; o; r; e; "/"; m; o; n; e; y

NEXT y: NEXT r: NEXT o: NEXT d: NEXT n: NEXT e: NEXT s

END


 このプログラムを実行させてみると、1時間経っても計算が終わらない。「FOR〜NEXT」のループが多すぎるせいだ(最初のバージョンは、すべての変数をループさせたため、このバージョンよりもはるかに時間がかかった。このバージョンでの計算時間は、486/75MHzのサブノートPCで2時間半ほど)。

 あまりにも時間がかかるので、手作業で解読したら、10分ほどで解けてしまった。人間のほうがパソコンよりもよっぽど優秀ではないか。その解読作業の手順は以下の通り。解説役はホームズ博士、質問役はワトソン君である。

  SEND
  □□□□
+ MORE
  □□□□
−−−−−−
 MONEY
 □□□□□

ワトソン(以下「ワ」)「こんな数式が解けるんですか? 暇な人もいるもんですね」
ホームズ(以下「ホ」)「数式と考えるから解くのがイヤになるんだよ。暗号パズルだと思えば楽しみながら解けばいいのだ」
「でも、どこから手をつけていいのかわかりまへん」
「真っ先に解けるのは“M”だね。足し算の場合、桁上がりする数字は1種類しかないだろ?」
「あ、そうか。足し算は、10以上の場合に桁上がりするけど、桁上がりする数字は1しかないってわけか」
「そのとおり。で、“M”に1を代入すると、次のようになるってわけだ」

  SEND
  □□□□
+ MORE
  1□□□
−−−−−−
 MONEY
 1□□□□

「で、1000の位の足し算が桁上がりするためには、“M=1”だから、“S=8 or 9”ってことになる」
「“S=8”になるのは、100の位から桁上がりするときだけですね」
「そういうこと。そして“S=8”(+桁上がり分の1)でも、“S=9”でも、“S+M=10”になるから、必然的に“O=0”ってことになるだろ」
「ああ、なるほど」

  SEND
  □□□□
+ MORE
  10□□
−−−−−−
 MONEY
 10□□□

「次はSの値を求めてみよう。Sは8か9のどちらかだが……」
「“S=8”の場合は、100の位から桁上がりしてくるってことですから、100の位は“E+O=10+N”ってわけか。でも“O(オー)=0”だから、10の位から桁上がりしてきたときしか、100の位の合計は桁上がりしないことになりますよね。つまり、”S=8”の場合、“E=9”ってことになりますよね」
「でも、その場合、“N”の値は?」
「“(1)+9+10=10”で、和の“10”の下一桁が“N”だから……あれ、“N=0”になってしまう」
「そういうこと。0は、すでに“O(オー)”に使われているからね。てことは“S=8”ではないということになる」
「つまり“S=9”というわけですね。となると、100の桁は、桁上がりしないってわけですね」
「そうだね。これで“S”“M”“O”の3つの数字が解けたことになる」
「残りは“E”“N”“D”“R”“Y”の5つか……」

  SEND
  9□□□
+ MORE
  10□□
−−−−−−
 MONEY
 10□□□

「うーん、でも、ここから後は、どうやって解いたらいいんだ?」
「100の桁は桁上がりしないことがわかったから、10の位から桁上がりすることを考えると、“(1)+E+0=N”、つまり“1+E=N”で……“N=E+1”ってことになるよね」
「ええ。それが?」
「この式を10の位に代入してみてごらん?」
「うーん。“N+R=10+E”だから“(E+1)+R=10+E”になりますが……。あれっ? この式を計算し直してみると“R=10+E−E−1”で“R=9”になってしまう。9は“S”で使われているから、これはダメってことですね?」
「ということになるね。でも、1の位の和が桁上がりするとしたら?」
「ええと、“(1)+(1+E)+R=10+E”で、つまり“R=8”というわけか」

  SEND
  9□□□
+ MORE
  108□
−−−−−−
 MONEY
 10□□□

「これで4つ。残りも“E”“N”“D”“Y”の4つか……」
「1の位を計算してみたら?」
「1の位は100の位にも桁上がりするから“D+E=10+Y”ですよね。しかも0、1、8、9は使われているから、“1<D<8”“1<E<8”“1<Y<8”ってわけか。ついでに“1<N<8”でもあるわけだ。それから“D+E>11”ってことですね。ここで“D”と“E”に数字を代入してみると……」

「結局、“D”の値は7しかありませんね」
「じゃ、それを数式に代入してみたら?」
「“D=7”のときは“E=5”“Y=2”“N=6”ってことになりますね。これを元の数式に代入してみたら……」

   SEND
   9567
 + MORE
   1085
 −−−−−−
  MONEY
  10652

「ちゃんと計算が合ってますね。これで正解ってことですか?」
「BASICのプログラムも同じ答えだから、正解なんだろうね、きっと」


 ああ、こんなことしていて、また原稿の締切が……。

もう一問の数学推理クイズを見る
トップページに戻る