TopCoder 始めました

この記事や同僚の話などで存在は知っていた TopCoder. 今日, 思い立って登録してアルゴリズム部門のところを2問ほど解いてみた.


問題の色としては Project Euler に近かったりもするので, 楽しめそうだ.


まだ良く分かってないところとしては, 以下の感じ.

  • java での unused code rule が把握できていない.

helper class (実装は inner class) を作ったら, 「使わないコードが30%以上あります」と警告されたが helper class もダメなんだろうか?

  • 回答の得点は掛かった時間で決まるようだが, 満点, つまり経過時間0秒って人は何なんだろう?

単純にその問題を読んでから回答を書き込むまでの時間を計っているのだと思ったが, Practice Room だと時間の計り方が違うのだろうか?


言語の選択肢は java, C++, C#, VB, Python でした. 一番コーディングした時間が長いのが java だったのでとりあえず使って解いてみたけど, アルゴリズム系のコーディングには向かないことが良く分かった. 特に, 書いては消し, コードをあっちからこっちに移動し, 切り貼りして……という俺のコーディングスタイルだと, java のかっちりした言語仕様は手に馴染まない.


最近 Jython も始めたことだし, Python が選べる問題は Python で解こうかな. (今回解いた問題はなぜか Python が選べない状態にしてあった. ) java と比べた Python の(俺にとっての)良いところは, 試行錯誤しながらクラスを作れるところだな. java の場合は良く設計を考えて, インターフェースを決定してから実装に入らないと後悔することが多い. おまけに「java の世界にはクラスとオブジェクトしかいません」ていう思想の言語であるせいで, 関数(ロジック)を扱うのにもクラスを用意するという大掛かりな作業をしなければならない.


それに比べ Python はクラスやオブジェクトのメソッドとクラスに属さない関数を同等に扱っている印象を受ける. というのも Python ではインスタンスメソッドの第一引数に self を指定しなければならないのだが, これは C のような言語で多態を実現しようとするときにメソッドを呼び出したオブジェクトの型で条件分岐をしようとするイメージがある. つまり, インスタンスメソッドと言っても単なるシンタックスシュガーであり, その実体は普通の関数と何ら変わりがない, と俺は感じるのである.
他にもクラスメソッドの登録やプロパティの登録などに, 「『クラス』って言ってもそんなに堅苦しいものじゃなくて, モジュールの切り方を細かくしただけだよ. 気楽にプログラミングしようよ. 」というような思想が垣間見える気がする.


これのおかげでユーティリティ的な関数をインスタンスメソッドに変更したり, その逆の変換を行ったりという作業のが気持ちの上で楽になる. また, 「とりあえず関数だけ書いて意味が生まれてきたら, クラスにまとめる」という流れを「実際に実行させながら」行えるのが, 俺のコーディング方式に合っている.


後半は言語について想いをぶちまけた文章になっちゃいました(^-^;
これからもぼちぼち TopCoderProject Euler に取り組むと思うので, (読んでる方がもし居れば)お楽しみに.


# そう言えば, Project Euler の答えを載せてるサイトがあるらしいですね.
# 俺も答えを求めるプログラムのソースコードを載せてるが微妙かもね.
# これについてはまた別のエントリで書きます.