トップページに戻る    次のC#のサンプルへ    前のC#のサンプルへ

Cマガ電脳クラブ(第007回) ひとつ違った・・・

問題

覆面算を解いてみよう。
覆面算とは、ある正しい式があってその数字を文字で置き換えたものである。
問題をふたつ用意した。どちらも文字どおり計算すると1だけ違っている。
それでも覆面算としてなら、ちゃんと解ける。

例題として、式(a)を解いてみると、
 138 × 138 = 19044
となる。

さあ、式(b)を解いてください。ちょっとやさしすぎたかな?
式(a)  TWO × TWO  =  THREE
式(b)  TWO × FIVE = ELEVEN


ソース

<?php error_reporting(E_ALL);

for ($TWOint = 100; $TWOint <= 999; $TWOint++) {
    $THREEint = $TWOint * $TWOint;
    if ($THREEint < 10000) continue;
    if (99999 < $THREEint) break;

    $TWO = strval($TWOint);
    $THREE = strval($THREEint);
    if ($TWO[0] != $THREE[0]) continue;
    if ($THREE[3] != $THREE[4]) continue;

    $EnumChar = str_split($TWO . $TWO . $THREE);
    if (count(array_keys($EnumChar , $TWO[0]))   != 3) continue; //Tは3つ
    if (count(array_keys($EnumChar , $TWO[1]))   != 2) continue; //Wは2つ
    if (count(array_keys($EnumChar , $TWO[2]))   != 2) continue; //Oは2つ
    if (count(array_keys($EnumChar , $THREE[1])) != 1) continue; //Hは1つ
    if (count(array_keys($EnumChar , $THREE[2])) != 1) continue; //Rは1つ
    if (count(array_keys($EnumChar , $THREE[3])) != 2) continue; //Eは2つ

    printf('%3d * %4d = %6d' . PHP_EOL , $TWOint , $TWOint , $THREEint);
}

for ($TWOint = 100; $TWOint <= 999; $TWOint++) {
    for ($FIVEint = 1000; $FIVEint <= 9999; $FIVEint++) {
        $ELEVENint = $TWOint * $FIVEint;
        if ($ELEVENint < 100000) continue;
        if (999999 < $ELEVENint) break;

        $TWO = strval($TWOint);
        $FIVE = strval($FIVEint);
        $ELEVEN = strval($ELEVENint);

        if ($FIVE[2] != $ELEVEN[3]) continue;
        if ($FIVE[3] != $ELEVEN[0]) continue;
        if ($FIVE[3] != $ELEVEN[2]) continue;
        if ($FIVE[3] != $ELEVEN[4]) continue;

        $EnumChar = str_split($TWO . $FIVE . $ELEVEN);

        if (count(array_keys($EnumChar , $TWO[0]))  != 1) continue; //Tは1つ
        if (count(array_keys($EnumChar , $TWO[1]))  != 1) continue; //Wは1つ
        if (count(array_keys($EnumChar , $TWO[2]))  != 1) continue; //Oは1つ
        if (count(array_keys($EnumChar , $FIVE[0])) != 1) continue; //Fは1つ
        if (count(array_keys($EnumChar , $FIVE[1])) != 1) continue; //Iは1つ
        if (count(array_keys($EnumChar , $FIVE[2])) != 2) continue; //Vは2つ
        if (count(array_keys($EnumChar , $FIVE[3])) != 4) continue; //Eは4つ
        if (count(array_keys($EnumChar , $ELEVEN[1])) != 1) continue; //Lは1つ
        if (count(array_keys($EnumChar , $ELEVEN[5])) != 1) continue; //Nは1つ

        printf('%3d * %4d = %6d' . PHP_EOL , $TWOint , $FIVEint , $ELEVENint);
    }
}


実行結果

138 *  138 =  19044
426 * 1375 = 585750


解説

array_keys関数に第2引数を指定して、件数を調べてます。

C#で解いたもの