×

[PR]この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。

[パズル]小町算

「小町算(こまちざん)」とは、1〜9までの数字と+、−、×、÷  の記号を使って、計算結果が100になる式を作る数学パズルです。江戸時代にはすでに知られていたということで、歴史あるパズルです。

例えば、
123+45−67+8−9=100
はその正解の一つです。

このパズルの変形として、+、−だけ使うものとか、()を認めるものとか、色々あるようです。
ここでは、+、−だけを使って100になるような式を求めています。

解き方はいろいろあると思いますが、1□2□3□4□5□6□7□8□9の四角の中に、+、−、空白を入れてゆき、その計算結果が100になるものを求めという方法を採用しています。
つまり、これも組合せの一種ということになります。
この組合せを求めるのに、再帰処理を使うのが普通ですが、今回は、LINQのクエリ式で組合せを求めています。
例えば、

上のコードを実行すると、

という結果を得られます。このように個数が事前に分かっている場合は、LINQのfromを複数使ったクエリ式を使うととても簡単です。
つまり、

という配列に対し、

とすれば、1□2□3□4□5□6□7□8□9の四角の中に入れる組合せを求めることが出来るというわけです。
そして、

とやって、計算式としても文字列を組み立てます。例えば、"1234 + 5 - 678 * 9"  のような文字列が出来上がります。
これをコンピュータに計算させれば良いわけです。
この計算をするのに、逆ポーランド記法(後置記法)に変換し、スタックを使って計算するコードを書こうかとも思ったのですが、面倒なので、System.CodeDom.Compiler.JScriptCodeProviderを使い、JScriptの式として計算させることにしました。

なお、このクラスを直接つかうのではなく、これをラップしたJScriptEvaluatorというクラスを作り、

のように簡単に計算式の結果を求められるようにしています。

残念ながら、System.CodeDom.Compiler.JScriptCodeProviderクラスは、Silverlight3では利用できないので、今回のプログラムはコンソールアプリケーションとして作成しています。


以下、C#のコードです。コメントにあるように、わずかの修正で × ÷ も使って 100 になる式を求めることが可能です。
■Program.cs

■JScriptEvaluator.cs