[パズル]小町算
「小町算(こまちざん)」とは、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 になる式を求めることが可能です。
例えば、
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
■JScriptEvaluator.cs