AOJはじめました

「AIZU ONLINE JUDGE」通称(AOJ)という、"提出されたプログラムの正しさ・効率の自動判定を行うオンラインジャッジシステム"がある。

いわゆる競技プログラミングプログラミングコンテストの過去問題などが多数掲載されており、各問題に対してソースコードを提出すると その問題の入力に対する正しい出力が得られているか否かを自動で判定してくれる。


…ていうのを何となくは知っていたのだけど実際に触ったことはなくて。先日 チームラボVSドワンゴ!競技プログラミング勉強会@ドワンゴオフィス - connpass というイベントに参加したときにオンラインジャッジに関する解説などがあり 実際に数問やってみる、ということでユーザ登録して挑戦してみたので、その後も継続して挑戦してみることにした。


べつに競技プログラミングで強くなりたい、とかではなく 主に「思考力・実装力を鍛える」という目的で、特に早解きやコードゴルフ的なことは意識しないことにした。
方針としては

  • まずはC++で頑張って自力で解く。
  • グローバル変数はできるだけ使わず、関数の入出力で回答を生成できるように。
  • どうにも上手くいかないときは他人のコードを見たりググって調べたりしても良い。
  • でも最終的にはちゃんと自分でコードを書く。
  • 解けても、もっと良いやり方がありそうであればリファクタリングする。
  • ついでにRubyでも解いてみる。
  • コードコメントは書かないが、考え方をメモしてgithubに上げる

という感じでやってみている。ようやく10問くらいできたところ。

https://github.com/sugyan/aoj


問題は山ほどあるけど、1番目から順番に…というのもアレなので ランダムで問題を選択するスクリプト を適当に作って、それで出てきたものに挑戦する、ようにしている。
とりあえず問題だけ読んで、移動中の電車の中で実装を考えて ちょっと気分転換するタイミングで実際にコードを書いてみたり。それくらいの気軽さで。


どの問題も数十行くらいで解けるようなものなのだけど、実際にやってみるととにかく予想外に詰まることが多くて、自分の力の無さを痛感する。他の人の回答を見て目から鱗、なことも多い。あとC++で書いたものをRubyに移植してみると すごく短く簡潔に書けたり すごく処理時間が増大したりするのを実感できて面白い。

週に2〜3問くらいのペースかな、とりあえず出来るだけ続けていきたいと思ってるけど もうちょい継続するモチベーションが欲しい気もするw 身近で同じ問題に挑戦したりレビューしあえるような仲間がいると良いのかなぁ