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

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

問題

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

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

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


ソース

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        for (int TWOint = 100; TWOint <= 999; TWOint++) {
            int THREEint = TWOint * TWOint;
            if (THREEint < 10000) continue;
            if (99999 < THREEint) break;

            string TWO = TWOint.ToString();
            string THREE = THREEint.ToString();
            if (TWO[0] != THREE[0]) continue;
            if (THREE[3] != THREE[4]) continue;

            IEnumerable<char> EnumChar = TWO.ToCharArray().Concat(
                                         TWO.ToCharArray()).Concat(
                                         THREE.ToCharArray());
            if (EnumChar.Count(X => X == TWO[0]) != 3) continue; //Tは3つ
            if (EnumChar.Count(X => X == TWO[1]) != 2) continue; //Wは2つ
            if (EnumChar.Count(X => X == TWO[2]) != 2) continue; //Oは2つ
            if (EnumChar.Count(X => X == THREE[1]) != 1) continue; //Hは1つ
            if (EnumChar.Count(X => X == THREE[2]) != 1) continue; //Rは1つ
            if (EnumChar.Count(X => X == THREE[3]) != 2) continue; //Eは2つ

            Console.WriteLine("{0,3} * {0,4} = {1,6}", TWOint, THREEint);
        }

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

                string TWO = TWOint.ToString();
                string FIVE = FIVEint.ToString();
                string ELEVEN = ELEVENint.ToString();

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

                IEnumerable<char> EnumChar = TWO.ToCharArray().Concat(
                                             FIVE.ToCharArray()).Concat(
                                             ELEVEN.ToCharArray());
                if (EnumChar.Count(X => X == TWO[0]) != 1) continue; //Tは1つ
                if (EnumChar.Count(X => X == TWO[1]) != 1) continue; //Wは1つ
                if (EnumChar.Count(X => X == TWO[2]) != 1) continue; //Oは1つ
                if (EnumChar.Count(X => X == FIVE[0]) != 1) continue; //Fは1つ
                if (EnumChar.Count(X => X == FIVE[1]) != 1) continue; //Iは1つ
                if (EnumChar.Count(X => X == FIVE[2]) != 2) continue; //Vは2つ
                if (EnumChar.Count(X => X == FIVE[3]) != 4) continue; //Eは4つ
                if (EnumChar.Count(X => X == ELEVEN[1]) != 1) continue; //Lは1つ
                if (EnumChar.Count(X => X == ELEVEN[5]) != 1) continue; //Nは1つ

                Console.WriteLine("{0,3} * {1,4} = {2,6}", TWOint, FIVEint, ELEVENint);
            }
        }
    }
}


実行結果

138 *  138 =  19044
426 * 1375 = 585750


解説

Char型の配列に変換して条件を1つずつチェックしてます。