朝日新聞2004年4月3日のパズルパーク問題

2004年4月3日(土)をもって3年目に突入ということである。おめでとうございます。

さてこの日の問題は以下の通り。

PUZZLEPARK という10文字のアルファベットに 0, 1, 5, 6, 7, 8, ÷, = を割り当て等式を完成させる。

同じ文字には同じ数字,記号を割り当て,違う文字には違う数字,記号を割り当てること。

解答への考え方(ヒント)

数字と記号の種類は8種類,文字も8種類。

虱潰しに文字を割り当てると88(=16,777,216)通り,約1600万通りある。

しかし実際は同じ文字を割り当てることが出来ないので,8!(=362,880)通り,約36万通りになる。

これくらいの数なら余裕だ。虱潰しでプログラムする。

プログラムは以下のような形式。一見すると88形式のようだが,各forの先頭で既に同じ記号が使われている場合枝刈りする処理を入れることで8!形式になる。

for( int i1=0; i1< 数字,記号の種類; i1++) { // P
    for( int i2=0; i2< 数字,記号の種類; i2++) { // U
        for( int i3=0; i3< 数字,記号の種類; i3++) { // Z
            for( int i4=0; i4< 数字,記号の種類; i4++) { // L
                for( int i5=0; i5< 数字,記号の種類; i5++) { // E
                    for( int i6=0; i6< 数字,記号の種類; i6++) { // A
                        for( int i7=0; i7< 数字,記号の種類; i7++) { // R
                            for( int i8=0; i8< 数字,記号の種類; i8++) { // K
                                P U Z Z L E P A R K で式が完成するか?
                            }
                        }
                    }
                }
            }
        }
    }
}

式が完成したかどうかチェックする

割り当てた文字から式を作成する。その式が正しいかどうか調べる。

例えば,PUZLEARKに015678÷=を順に割り当てると,以下の式が完成する。

01556708÷=

この式は間違っているので,この割り当ては解ではない。

少なくとも

数字1 ÷ 数字2 = 数字3

とならなければならない。そして

数字は全て整数なので,各数字を変数 a, b, c に割り当てると

if( a / b == c && ( a % b == 0)) { 正解 }

となる。

解速度