2010年04月28日

C#からJScriptのevalを呼び出し「四則演算式」を計算させる

   このエントリーをはてなブックマークに追加 Clip to Evernote
前回の「小町算」の続きです。
SelectManyとString.Formatで得た
"1234 + 5 - 678 * 9"
といった計算式(文字列)を計算させる必要がでてきます。
この結果が 100 ならば、小町算ということになります。

どうやって、プログラムで文字列で表された計算式を解釈し計算させるかですが、
ひとつは、逆ポーランド記法(後置記法)に変換し、スタックを使って計算するコードを書く方法。
でも一から書くとなるとちょっと面倒なので、System.CodeDom?.Compiler.JScriptCodeProviderを使い、 JScriptの式として計算させることにしました。

※ JScriptCodeProviderは、Microsoft.JScript アセンブリを参照に追加することで利用可能になります。

実行速度の面では不利かもしれませんが、JScriptCodeProviderを使ったほうがコードは確実に短くなると思います。

JScriptEvaluatorクラスというものを作り


のように書ければいろんなところで使えそうです。
staticメソッドにしてもいいですが、ここでは通常のインスタンスメソッドとして 実装しました。

このクラスの中では、System.CodeDom.Compiler.JScriptCodeProviderクラスを利用しています。
このJScriptCodeProviderクラスを使うと、JScriptのソースコードを C#側から動的にコンパイル・実行できます。
もちろん、C#から引数を渡して、そのメソッドを呼び出せます。

でも、リフレクション使っての呼び出しなので可読性が悪いです。
C#4.0のdynamic使えばもっと簡単に書けると思います。(試してません...)

ところで、ここでは、JScriptCodeProvider を使いましたが、CSharpCodeProvider を使っても同様のことが行えます。
しかし、C#だと型を意識したコードにしなければならないし、
1/2 は 0となってしまうので、1.0/2.0という式にしなくてはなりません。
JScriptのほうが都合がいいです。

ということで、JScriptEvaluator クラスのソースコードは、こちらに掲載しています。
  

Posted by gushwell at 21:01Comments(3)TrackBack(0)

2010年04月26日

LINQのSelectManyで組合せを求める

   このエントリーをはてなブックマークに追加 Clip to Evernote

LINQにはSelectMany演算子がありますが、これを使うと簡単に重複ありの組合せを求めることができます。

たとえば、1,2,3,4 の中から2つを抜き出す組合せは

とすれば、求めることができます。
こちらに載せた「小町算」では、これを応用して、

といった計算式を求めています。
以下、その抜粋でです。


これで得た結果を、1□2□3□4□5□6□7□8□9の四角の中に入れれば計算式が出来上がります。

コードの全体は、こちらに掲載しています。

  
Posted by gushwell at 21:20Comments(0)TrackBack(0)

2010年04月24日

メールマガジン「C#プログラミングレッスン」250号発行

   このエントリーをはてなブックマークに追加 Clip to Evernote

2004年から開始したメールマガジン「C#プログラミングレッスン」ですが、
4月27日の発行予定の『どう書く?org編- 漢数字で九九の表』で、とうとう250号の発行となります。

ここまで続けてこられたのも、ご購読していただいている皆さまのお陰と感謝しています。
次の目標は300号でしょうか。先は長いですが、頑張って続けたいと思いますので、
引き続きご愛読よろしくお願いします。

それと、メールマガジンに対するご意見、ご感想などをいただけると、とてもありがたいです。
よろしくお願いします。

ちなみに、今連載している「どう書く?org編」は、あと数回で終わらせ、次の話題に移ろうかと思っています。
次回の候補は、LINQ to SQL、C#4.0 & .NET Framework 4、正規表現、 Silverlight といったあたりです。
時期的に新人プログラマー向けの話題もやりたいとは思っていますが、昨年と重複てしまうので、躊躇しています。

  
Posted by gushwell at 10:15Comments(0)TrackBack(0)

2010年04月19日

C# プログラム小品集

   このエントリーをはてなブックマークに追加 Clip to Evernote
Webサイト「Gushwell's C# Programming Page」と当ブログをもっと有機的に結び付けたいなーという思いで「C#プログラム小品集」のコーナーに掲載したプログラムの一部をこのブログで紹介する試みを昨年末あたりから始めています。

でも、Webサイトにプログラムを掲載するたびに、このブログで紹介するのは、ちょっといやらしいかなと思って、紹介したのは、一部のみにとどめています。 Webサイトに、掲載するプログラムの数は今後も増やしてゆく予定ですが、プログラムの数も随分と増えましたし、せっかく公開したものですので、ここらでも、そのプログラムの一覧を掲載したいと思います。

これらのプログラムは、.NET Frameworkの使い方サンプルではなく、どちらかというとアルゴリズム学習に役に立つようなコードの掲載をしています。

ただ、僕は、普通のビジネスアプリのプログラマーであって、ゲームプログラマーでもなければ、情報科学の研究者でもないので、その方面の方からみると、もっと良いやり方があるだろ、と突っ込まれるプログラムもあると思いますが、その点はご容赦を。

2011年4月30日現在
■初等数学関連■ 
階乗の計算 再帰を使ったコード
素数の計算 エラトステネスのふるいで素数を求める
メビウス関数 素因数分解しないで求めています 
フィボナッチ数列 yield return 構文を使った例
最大公約数 ユークリッドの互除法 (Silverlight)
最小公倍数 最大公約数を利用し求める (Silverlight)
素因数分解 Brute force methodによる素因数分解 (Silverlight)
完全数を求める メルセンヌ素数から完全数を導く(Silverlight)
友愛数を求める 真の約数を求めて友愛数を導く (Silverlight)
婚約数を求める   友愛数に似てます。ListBoxに結果をバインド(Silverlight)
ゴールドバッハの予想 偶数は2つの素数の和で表される? (silverlight)
三角数 三角数に関連する3つの短いコード(silverlight)
円周率を10000桁まで求める マチンの公式を使い1万桁まで求める(Silverlight)
カプレカ数 String.SubStringで文字列を分割(Silverlight)
N寄生数(Parastic Number) 筆算と同様の方法で巨大な数(N寄生数)を求める(silverlight)

■組み合わせ■
順列を求める 与えられたすべての要素を使った順列を求めています
順列を求める(2) n個の異なる要素の中から m個を選ぶ順列 (Silverlight)
組合せ n個の異なる要素の中から m個を選ぶ組合せ (Silverlight)
攪乱順列 (完全順列) i番目の要素が i でない順列を求める (Silverlight)

■図形■
完全グラフ 凸多角形の完全グラフの一筆書き (Silverlight)
凸多角形の外周を引く 複数の点から凸多角形の外周を引く(Silverlight)
ヒルベルト曲線 フラクタル図形の基本をC#で  (Silverlight)
ドラゴン曲線 フラクタル図形の第2弾。(Silverlight)

■シミュレーション■
2次元ランダムウォーク 2次元ランダムウォークの動きを可視化 (Silverlight)
1次元ランダムウォーク ±5%で遷移する1次元ランダムウォーク(Silverlight)

■セルオートマトン■
ルール30 ルール30と呼ばれる1次元セルオートマトン (Silverlight)
シェルピンスキーのギャスケット ルール90と呼ばれる1次元セルオートマトン (Silverlight)
ラングトンのアリ ランダムな動きが一転直線へ変わる不思議 (Silverlight)

■パズル関連■
8クィーンパズル N-Queenに対応しています。
碁石拾い 日本古来の碁石を使ったパズルを再帰で解く (Silverlight)
ナイト(騎士)の最適配置 チェス盤に騎士を配置し効き筋で埋めます (Silverlight)
ステインハウスの三角形  整数のビットパターンで組合せを求める (Silverlight)
Triangle15パズル 順列が問題を解くカギ (Silverlight)
覆銭問題 Eventを発行し途中経過を知らせる (Silverlight)
割り切れる4桁の逆転数 逆転した数で割り切れる4桁の数を得る
巡回数 n倍すると巡回する自然数を求める (Silverlight)
小町算  1-9の数字と+−で100にする:LINQで組合せを求める 
2乗した値が1-9で構成 2乗した値と求めた値が1-9で構成される3桁の数を得る
小町数となる単位分数 約分して1/nとなる数の分母と分子が小町数 (Silverlight)
3つの式が等しくなる小町数 ○○-○=○○/○=○+○*○が小町数 (Silverlight)
センチュリーパズル K + N / D = 100 のK,N,Dが小町数 (Silverlight)
小町リング 円の中の数の合計が等しくる小町数 (Silverlight)

■ボードゲーム(の一部)■
梅花碁の勝ち判定 梅花碁の勝ちパターンを見つける (Silverlight)
8クィーンゲーム 8Queenパズルのゲーム版. 単純な思考ルーチン (Silverlight)

■その他■
FizzBuzz問題 FizzBuzzの一般化を試みています。
簡易catコマンド IEnumerable<T>の実装サンプル
簡易tailコマンド リングバッファーの実装サンプル
2次元配列の回転 基本機能の組み合わせで多機能化を実現 (Silverlight)
最大面積の領域を求める マウスのドラッグに対応する(Silverlight)


■今後の予定

あくまでも予定ですが、以下のようなプログラムも掲載したいなーと思っています。

ニュートン法、遺伝的アルゴリズム、ビンPacking、部分和問題、コッホ曲線、ライフゲーム、騎士巡回、ハノイの塔、マジックスターパズルなどなど。

それと、パズルプログラムは、昔書いたプログラムが他にもまだいくつかありますので、Silverlight+C#に移植し掲載してゆきたいです。

ちなみに、これまでのアクセスTop5は、
  1. [パズル]小町算
  2. ヒルベルト曲線
  3. 階乗の計算
  4. 多角形の完全グラフ
  5. 2次元ランダムウォーク
で、4つがこちらのブログで紹介したものばかりで、やはり、紹介したものとそうでないものの差が出ているような気がします。   
Posted by gushwell at 22:40Comments(0)TrackBack(0)

2010年04月18日

「はてなアンテナ」に当ブログを設定していただいている方へ

   このエントリーをはてなブックマークに追加 Clip to Evernote

以下の内容は、僕の大きな勘違いでした m(_ _)m
はてなアンテナの「更新チェック範囲」の設定は、全ユーザ共通の設定なので、僕自身が登録すれば良いだけでした。 もう少しちゃんと確認してからアップすべきでした。反省です。(2010/04/19)


はてなアンテナに当ブログを登録してくださっている方がいらっしゃるようです。
そのこと自体は大変うれしいのですが、はてなアンテナの仕様により、
更新内容がLivedoorが挿入する広告の内容を拾ってきてしまうようです。
そのため、もし気が向きましたら、「はてなアンテナ」に以下の設定を
していただけると嬉しいです。

設定手順

  1. 1.ブラウザでアンテナの画面右上の[管理]リンクをクリックします。
  2. 左ペインの[ページ一覧]をクリックします。
  3. [窓際プログラマーの独り言 -C#の話題を中心に]を選択します。
  4. [ページの編集]画面に移動しますので、画面下部の[更新チェック範囲]の欄を以下のように設定します。
    regexp:\d*年\d*月\d*日 が含まれる行以下、
    Posted by が含まれる行より上だけをチェック
    ※ 青の部分が入力する内容です。
  5. [この内容に更新する]ボタンを押します。

以上です。

これで、「はてなアンテナ」に正しく更新内容が表示されるようになります。
こちらのブログの設定で、「はてなアンテナ」に正しい更新内容が表示できるようになると
良いのですが、それが出来ないようです。
お手数ですが、よろしくお願いいたします。

  
Posted by gushwell at 14:08Comments(3)TrackBack(0)

2010年04月13日

電子書籍の衝撃

   このエントリーをはてなブックマークに追加 Clip to Evernote

電子ブック『電子書籍の衝撃』(著:佐々木俊尚)が、明日14日まで、110円で購入(ダウンロード)できます。
紙媒体の書籍を購入すると、1,155円のようですから、驚きの低価格です。
興味ある方は、購入してみてはどうでしょう。

僕も、昨日購入しました。

T-Timeビューアという無料のソフトで閲覧します。
まだ、数ページ読んだだけですが、かなり期待できそうです。

  
Posted by gushwell at 22:43Comments(0)TrackBack(0)

2010年04月07日

Windows Live Writerから投稿

   このエントリーをはてなブックマークに追加 Clip to Evernote
「livedoorブログをWindows Live Writerで編集可能!」http://syoujiki.doorblog.jp/archives/1894368.html を参考に、
Windows Live Writerから記事を投稿。 無事、投稿できたみたいです。 でも、カテゴリが設定できないですね。

プレビューがその場で確認できるのは、便利ですね。

  
Posted by gushwell at 23:10Comments(0)TrackBack(0)

2010年04月05日

Silverlight : MouseLeftButtonDownイベントが拾えない

   このエントリーをはてなブックマークに追加 Clip to Evernote
SilverlightでCanvasのMouseLeftButtonDownイベントを拾おうとしたら、イベントが拾えない。
おかしいなー。

しばらく悩んで、やっと、Backgroundプロパティに何か色を設定すれば、イベントが発生することが分かった。


Canvasは、visible プロパティを持たないので、Background プロパティが nullの場合(Canvasは、デフォルトでBackground プロパティが null)は、非表示なので、マウスイベントが拾えないということらしい。


前にも同じことで悩んだので、ここに書いておく。
  
Posted by gushwell at 23:01Comments(0)TrackBack(0)