2010/12お楽しみはこれからだ!2010年12月31日金曜日Feedのアドレスちょっとあまりにも配信に時差がでちゃうので、Feedのアドレス変えます。Blogpost:無聊を託つhttp://feeds.feedburner.com/blogspot/jNRCtwTumblr:等閑に付さないようにhttp://feeds.feedburner.com/tumblr/ijTN旧FeedのアドレスはTumblrの方に向けます。問題だと思っていることはホントに問題なの?すっかり忘れてました。新しく開発者を採用するにあたり、会社の方針に合わせてコードを書いてもらいました。採用担当としてこんな問題を考えました。問題内容2つの文字列を与えられた時、それぞれの文字列の一致率を0~1の間で算出する関数を作成せよ。※一致率の定義の仕様も含めて考えてください。考え方や思うところはあると思いますが、今回に関しては問題を解く過程をとても重視しました。いうふうに仕様を決めるのかも含め、です。内容からして勝手に仕様を決めていいように思われるかもしれないですが、そこの解釈も重視です。与えられた情報の範囲内でどこまで飛べるのか、みたいな。value2.Length);}最初のほうはエラーチェックだから、今回別に無くてもよかったです。あれっすよ、こんなの10分やそこらでコード化するもんじゃないかもね。考え方というか解き方というか、問題はどこでどういう回答をビジネスオーナーは望んでいるのか、ですよね。問題を考えたものとしては、この問題で先頭一致の割合だけでとくのが一番簡単なのは分かってて、それだけじゃない解き方を答えて欲しいな~、と思ってました。“どのくらい一致しているか”の定義は様々だけど「全体文字数に占める一致文字数の割合」が手頃な回答ですよね。一致文字数というのはどういう意味だと解釈するのが面白いか。xxAAww※前半だけ、後半だけは前半+中央と中央+後半と同じ。こんな感じのパターン。ちなみにこのパターンを答えた人がひとりだけいましたよ。なんで同じ答えにたどり着いたのかというと、そういう定義をオーナーが望んでると聞き出したからです。そりゃ同じになるわね。このコードがホントにそれっぽく一致率がでるのか確認するテストコード。rate);}だいたいいい感じなんじゃないっすかね。セマンティックとか関係なく、ですから。問題はここまでで終了。ひとり答えにたどり着いたクマさんに拍手。ここからさらに考え方を進めてみましょう。文字列が文章だとしたら。文章だと”の”とか”を”とかが入ってくるから、普通に一致させるだけだと、それっぽくならないですね。このアルゴリズムを再帰に改造して、前半を無視したほうが一致率が上がるなら無視するというふうに改造してみます。何でかというと、このアルゴリズムだと一致率は上昇して頂点になったあと下降するっていう山型になるはずだからです。現在の位置と次の位置との比較で一致率が上昇してるなら、現在の位置は無視したほうがそれっぽい数値に近づくってことです。するとコピペ文章なんじゃん?っていうものに関しての判定が”それっぽく”できます。”それっぽく”ですよ。value2.Length);}で、最初のテストがパスするのを確認したうえで、以下のテスト。MatchRate.Rate("衆院は31日の夜、会議を開き、日本郵政3社への再編などを柱とする郵政改革法案を賛成多数で可決し、参院に送付した。与党は参院でも短時間で審議し、6月16日までの会期内成立を目指す構え。自民、公明、みんな、たちあがれ日本の野党4党は1日、与党の意向を受け、本会議開催を強行した横路孝弘衆院議長に対する不信任決議案を提出する。","衆院は31日深夜、本会議を開き、日本郵政グループの3社への再編などを柱とする郵政改革法案を民主、国民新党などの賛成多数で可決し、参院に送付した。与党は参院でも短時間で審議を終え、6月16日までの会期内成立を目指す構え。自民、公明、みんな、たちあがれ日本の野党4党は1日、与党の意向を受け、本会議開催を強行した横路孝弘衆院議長に対する不信任決議案を提出する。MatchRate.RecursiveCommand);Console.WriteLine(rate);}ソースアップしておきまーす。EngineCodePlexで新しいのが出てたよ~。テンプレートエンジンっていろいろ用途があるけど需要はどーなんだろね。Razor記法でWeb以外にも使えるって楽しいっすよね。ちなみにASP.NETの<%...%>とか<%$...%>とか<%#...%>なんかの記法も用途特化したテンプレートエンジンが解釈してクラスファイルを生成してますよね。Razorは純粋にテンプレートエンジンって言ってるくらいだからWebのコンテキストや実行Hostに依存しないわけですね。Consoleアプリでも使えるってことです。HtmlHelperとかWeb関連のアセンブリに依存するものはあるとしても、それ自体はRazorの機能じゃなくてHelperの機能。TemplateBaseクラスが生成されるクラスの親クラスになるって言う仕組みなので、親クラスにいろいろWeb関連の機能を保持するっていう、Razorとは直接関係なっしんぐ。サンプル見てみるとこんな感じですね。});Console.WriteLine(result);Console.ReadLine();簡単ですね~。サンプルのHtmlHelperを使うパターン。model);Console.WriteLine(result);Console.ReadLine();はい、これも簡単ですね。PageModelは自分で作ってね。あと、RazorEngine.Coreだけじゃ足りなくて、RazorEngine.Templatesアセンブリも必要なので、ソースのダウンロードはここからどーぞ。これらは全て実行時にクラスファイル(特に指定が無い限りc#)をオンメモリで生成してコンパイルします。そのタイミングでAppDomain内からはクラスのインスタンスを生成できるようになるって言う流れはASP.NETのパイプラインそのもの。World!のほう)をステップ実行していくと、どういうクラス名で生成されるのかというのを追いかけていくと...。Guid.NewGuid()から数字とハイフンを除外したのがクラス名。それにNamespaceをくっつけてます。