トップページに戻る
次の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つずつチェックしてます。