柿×食う=客
中学二年の時、数学の先生が算数パズルを出題した。
答えを聞かぬまま私が転校してしまい、今に至る。ふと思い出し気になったので、Excelで無理やり解いてみよう。
出題内容は、こうだ。
かき×くう=きゃく
条件
- それぞれの平仮名に、数字が一つ入る。
- 同じ平仮名には、必ず同じ数字が入る。
- 異なる平仮名に、同じ数字は入らない。
今回登場する平仮名は、「か・き・く・う・や」の5文字だ。
まず何も考えずに、5つの文字をループさせることにした。
ただ、「かき」「くう」「きゃく」の一番大きな桁である「か・き・く」は、0になると桁が変わってしまうため、0ではないことが分かる。また「う」が0である場合、
き×う=0
となって、「う=く」になってしまう。従って、「う」は0ではない。
・か、き、く、う ⇒ 1~9
・や ⇒ 0~9
でループさせるとしよう。
5つの数字について、重複確認も必要だ。今回は連想配列がkeyの重複を許さないことから、keyの数で重複確認することにした。
Sub 算数パズル() Dim か As Long Dim き As Long Dim く As Long Dim う As Long Dim や As Long Dim 乗数 As Long Dim 被乗数 As Long Dim 答え As Long Dim 重複確認 As Dictionary For か = 1 To 9 For き = 1 To 9 For く = 1 To 9 For う = 1 To 9 For や = 0 To 9 乗数 = か * 10 + き 被乗数 = く * 10 + う 答え = き * 100 + や * 10 + く If 乗数 * 被乗数 = 答え Then Set 重複確認 = New Dictionary 重複確認(か) = か 重複確認(き) = き 重複確認(く) = く 重複確認(う) = う 重複確認(や) = や If UBound(重複確認.Keys) = 4 Then MsgBox "か:" & か & vbNewLine & _ "き:" & き & vbNewLine & _ "く:" & く & vbNewLine & _ "う:" & う & vbNewLine & _ "や:" & や End If End If Next Next Next Next Next End Sub
結果、答えが二つ出た。
か | き | く | う | ゃ |
---|---|---|---|---|
2 | 3 | 1 | 7 | 9 |
5 | 7 | 1 | 3 | 4 |
このような問題で、答えが二つあっても良いのだろうか?
いずれにしても長年の疑問が、これでまた一つ解決した。
しかし、今回作成したコードは決め打ちばかりで、全く汎用性が無い。
次回は、これに少しでも汎用性を持たせてみるとします。
参考まで。