AtCoder を始めようかと思っている学生たちへ

現在、全国的に情報系の学生たちの間では空前の AtCoder ブームとなっていて、
「AtCoder を始めた知り合いが増えてきて、就職活動にも活用できそうだし、この機会に自分も始めてみたいけどどうしようかな」と考えている学生も増えてきているのではないでしょうか?
結論を先に言うと「なるべく早いうちから参加しましょう」となりますが、これまでに何回かコンテストに出場してみた経験からいろいろ書いていこうと思います。

AtCoder は、競技プログラミングのコンテストを Web で実施しているサービスです。
以前は競技プログラミングといえば難解でマイナーなイメージでしたが、AtCoder では難度の低い問題から段階的に用意されており、ページも見やすくカジュアルに参加できるようになっています。
初心者向けである AtCoder Beginner Contest はほぼ毎週、土曜日または日曜日の夜にオンラインで実施されています。

AtCoder の参加者のうち7割を学生が占めています。
とくにここ1年くらいの参加者の伸びが大きく、最近の AtCoder Beginner Contest では約5000人が参加しています。
しかしこのブームに乗って就職活動に役立てようと思いつつも、「実力を上げてから参加したい」と考えている人もいるのではないでしょうか?

これに対しては「なるべく早いうちから参加しましょう」が答えです。
なぜなら、コンテストへの参加回数が少ないと、実力がレートに反映されないからです。
最低でも14回以上は参加しておかないと実力よりも低いレートになる仕組みで (リセットマラソンの効果が低い)、実力証明が欲しいと思ったときに急に参加しても実力が認定されるわけではありません。

また、AtCoder におけるレートやランク (色) のレベル感を認識しておく必要があります。こちらの記事に説明が載っています。

AtCoder には日本全国・世界の強者が集まっており、水色 (1200) 以上あれば実務上カンストの上級者だろうと考えています。実社会では緑色の人に遭遇するのもなかなか難しいでしょう。
通常の学生であれば、茶色が認定されれば十分実力があると言えます。

初級者はまず AtCoder Beginner Contest に参加して、問題 A・B を解くことを目標にしましょう。
問題 C までは分岐、ループ、データ集計など、一般的な開発者が実務で書く程度のコードでクリアできます。
問題 D 以降は処理高速化のためのアルゴリズムの知識・経験が必要になってきます。
もし仕事でプログラミングをしているのであれば、問題 C までは正解しておきたいところです。

本番のコンテストに参加する前に、過去問を練習しておきましょう。
問題文や解答の体裁に慣れていないと本番で無駄な時間を使ってしまいます (標準入出力など)。
コンテスト中もコンテスト外のときもサイトの使い方はまったく同じなので、過去問で本番同様の練習ができます。
過去のコンテストの問題は全て公開されています。他の参加者のコードを読んで参考にするのもよいでしょう。
AtCoder Problems という有志のサイトもおすすめです。

プログラミング言語は好きなものを選んでください。
標準入出力などのよく使うコードを含めたテンプレートを用意しておくとよいでしょう。例えば C# ではこんな感じです。
https://gist.github.com/sakapon/a88697da54fc78f838baeadcc19b54c4

各問題にはテストケースが用意されていて、それらをすべてパスすれば正解 (Accepted) となります。
こんな感じで、エディターからコピー&ペーストで提出できます。

AtCoder-Sub

というわけでまずは2~3か月、毎週参加し続けるのです(沼

追記 (11/26):出場11回目で水色に到達しました。
ABC146-Rating

comments

習作のすすめ

「習作」というのは、主に芸術の分野で使われている言葉で、練習のために小作品を作ることを指します。
プログラミングにおいても習作はいいぞ、という話をします。

学生の皆さんは普段、授業などで身に付けた技術を応用して何かを制作しているでしょうか?
あるいは逆に、何かを実現するために技術を応用しているでしょうか?
創作の経験の少ない人が何か壮大なものを作りたいと思い浮かべたとしても、すぐに実現するのは難しいことだと思います。
技術の習得とその応用には乖離があるのです。技術力と創造性のマッチングが必要で、いずれかが不足していても達成できません。

そこで、普段からそのギャップを埋めるための練習をしておくことが求められます。
ブログのネタを例に考えればわかりやすいと思います。
最近習得した技術についてブログの記事を何か書くことになったとして、他の人が作ったチュートリアルを手順通りに実施してそれについて書く・・・というのでは物足りないですよね。
例えば、自分なりの視点でどういう場合に役に立ちそうかを考えながら技術検証し、自分の興味の延長にあるサンプルを作るという方法が考えられます。これが習作です。
いろいろな人のブログ記事を見れば、このタイプがかなりあることに気づくでしょう。ブログのネタとしてなんとなく「ちょうどええ」範囲があると思います。

習作の結果として前例に重複することもあるとは思いますが、それはかまいません。
自分で考え出したものを自分で解決して作ってみることが成長につながります。
初めて使う技術の検証と軽い創作を同時に実施するという点で一石二鳥であると考えています。

一見それほどでもないアイデアのものでも、実装してみると知らなかった機能に出会えたり、あるいは、考えていたことが実現不可能であることがわかったりします。
その結果から技術を深掘りしていくこともあれば、アイデアを別の作品に昇華させていくこともできるでしょう。
習作では、技術力と創造性の向上の両面があることがポイントです。
技術検証や創作の練習を通して、今後の引き出しを増やし、何ができるかわかるようになります。

英語の表現を新しく覚えたら自分が日常生活で使いそうな文にアレンジしてみたり、
微積分を覚えたら乗り物の速度・加速度や目的地までの距離を概算してみたり、
身に付けたことを普段から社会に応用しているか、そのための視点を持っているかが大切になるのです。

参照

comments