柿×食う=客

中学二年の時、数学の先生が算数パズルを出題した。
答えを聞かぬまま私が転校してしまい、今に至る。ふと思い出し気になったので、Excelで無理やり解いてみよう。
f:id:Infoment:20190112142759p:plain

出題内容は、こうだ。

かき×くう=きゃく

f:id:Infoment:20190112144300p:plain
条件

  1. それぞれの平仮名に、数字が一つ入る。
  2. 同じ平仮名には、必ず同じ数字が入る。
  3. 異なる平仮名に、同じ数字は入らない。

今回登場する平仮名は、「か・き・く・う・や」の5文字だ。
まず何も考えずに、5つの文字をループさせることにした。

ただ、「かき」「くう」「きゃく」の一番大きな桁である「か・き・く」は、0になると桁が変わってしまうため、0ではないことが分かる。また「う」が0である場合、

き×う=0

となって、「う=く」になってしまう。従って、「う」は0ではない。
・か、き、く、う ⇒ 1~9
・や ⇒ 0~9
でループさせるとしよう。

5つの数字について、重複確認も必要だ。今回は連想配列がkeyの重複を許さないことから、keyの数で重複確認することにした。

Sub 算数パズル()

    DimAs Long
    DimAs Long
    DimAs Long
    DimAs Long
    DimAs 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

このような問題で、答えが二つあっても良いのだろうか?
いずれにしても長年の疑問が、これでまた一つ解決した。

しかし、今回作成したコードは決め打ちばかりで、全く汎用性が無い。

次回は、これに少しでも汎用性を持たせてみるとします。

参考まで。