全国同時開催の勉強会イベント、Community Open Day 2013が無事終わりました!僕も北陸会場で、スタッフ兼スピーカーとしての活動しました。遠方からわざわざ北陸まで来て頂いたスピーカーのみなさん、そして休日にも関わらずお越しいただいた参加者のみなさん、本当にありがとうございました!
ライブコーディング対決
スピーカーとしては、北信越のC# MVPが3人 (@Fujiwo / @AILight / @xin9le) 集まるということで「C# MVPに聞くC#アレコレ!」と題してお時間を頂きました。Hokuriku.NETがいつも会場としてお借りしている石川工業高等専門学校の一室はスクリーンが3枚横並んでいて、同時に別々のPCの画面を表示することができます。これを利用して、他の会場にないであろう試みとしてライブコーディング対決をしました。ルールは次の通りです。
- 3人で「実行速度とコードの短さ」で競う
- 参加者の皆さんに3人の誰かの応援者になってもらう
- 応援した人が勝ったらプレゼントが貰える
ここで大事なのが出来レースにならないようにすることです。問題を作ったのは@AILightさんですが、僕と@Fujiwoさんは本当に何も知らされていませんでした。「ライブコーディングする予定なのでその準備だけお願いしますー」とだけ伝えられて本番に臨むという、実にエグいハラハラドキドキ感が良かったですw 問題はこんな感じでした。
C#er 3人によるプログラム対決は、こんなルールです。さぁ、皆さんも挑戦してみませんか? #hokunet #cod2013jp pic.twitter.com/arNr5rY23Y
— Takae Sakushima (@RamuMystery) 2013, 5月 11
ちょっと味をしめたので、「ライブコーディング対決」をHokuriku.NETの名物にしようと思います!w
現時点で最速じゃないかと思うコード
とりあえず、Enumerable.Range(1, 100).Select(...)みたいにLINQを使うのは、内部でyield returnすることになるし、MoveNextプロパティとCurrentプロパティへのアクセスがあるので遅い。スピードを出すためには (書いたら負けな気がしないでもないけれど) for文を使うのが良さげ。割り切れない場合の処理はフラグで判定して、そのフラグはfor文の外に定義することでインスタンス生成の回数を減らすと良いはず。ということで、現時点で最速と思しきコードは次のような感じじゃないかと思います。
private static string HokurikuSaiko() { bool aliquot = false; var builder = new StringBuilder(); for (int i = 1; i <= 100; i++) { if (i % 2 == 0){ builder.Append("北陸"); aliquot = true; } if (i % 3 == 0){ builder.Append("コミュニティ"); aliquot = true; } if (i % 5 == 0){ builder.Append("最高!!"); aliquot = true; } if (!aliquot) { builder.Append(i); } builder.Append(','); aliquot = false; } return builder.ToString(); }
もっと速そうな方法があったら、ぜひ教えてください。文字数を減らすのは変数名を短くするというのがありますが、それはちょっとズルいのであまり考えないことにしてます。ロジックとしてもっと短くする方法があれば、それも知りたいです。
プレゼント
提供したプレゼントは@ufcppさんが書いた「スラスラわかるC#」3冊です。先日のRoom metro #15のとき@ufcppさんから「10冊買え」と言われてしまったので、これは約束を果たすときだと思って選びました。実費なのでさすがに10冊とはいかなかったのですが...w
PowerPoint資料
ライブコーディング対決以外にも、セッション中に「C#の好きなところ」を伝える時間がありました。そのときの資料が以下です。
C#は最高に気持ちよくコーディングさせてくれる!ホント、それに尽きます。
ちょっと裏話
この内容はGlobal Summitの最終日のパーティー中に、3人で飲みながらアイディアを出し合ってました。参加者だけでなく僕たち登壇側も楽しめる良いアイディアだったんじゃないかなと思っています。@Fujiwoさん、@AILightさんのお2人に感謝!