tozangezan's diary

勝手にソースコードをコピペして利用しないでください。

ゲームとして薦める競技プログラミング

この記事は例によってブログに記事を書きます Advent Calendar 2014 - Adventarを埋めるために書かれた記事です。

なぜこんな記事を書くのか

まずよく言われていることとして、競技プログラマーは多数が音ゲーをしている(CODE FESTIVALでは筐体が設置されるほど)ということがあります。それから音ゲーマーのTwitterを見ているとほかによくやっている趣味としては、タイピング(とくにtypewellみたいなタイムを競ったりするもの)とか、ルービックキューブ(これも)みたいなのをよく見かけます。
結構これらには共通点があると思うんですよ。挙げます。

  • 多少変な要素はあるにしても、「地力」みたいな要素が本質。ほかのゲームでよくある経験値をためるとか、同じことを何度もやるとか、「単なる運」がよいのを待つとか、そういう要素がかなり少ないもしくは地力要素に比べたらかなり低い。要は後になってから「今まで何でこんなのができなかったんだ」と感じることが結構多い
  • やればその「地力」は伸びる
  • 1回(1曲、1プレイ、1問、5or12solve)それをやるのにめちゃくちゃ時間がかかるわけではない。せいぜい数分~数十分(めちゃくちゃ大変な問題は除きます)

ということで結構これらのゲームには似たようなところが多いんじゃないかと思って、この記事を書いています。

なんでこんなことを書いて人を増やしたいのかというと、競技プログラミングが人気になるにつれていろんな企業で好待遇のコンテストが多数開かれるようになって、毎回それに参加していろいろおいしい思いをしているので、今後さらに活発になってくれるとうれしいなあ、という思いがあります。そうなると問題は不足していくんでしょうけど

役に立つ/立たないの考えを捨てる

競技プログラミング界隈とその周辺では、「月刊競技プログラミングは役に立たない」というネタが有名になってしまっています。これは主に「競技プログラミングで身につくプログラミング能力には共同開発における保守性だかなんとかがぜんぜん含まれていないんだから、競技プログラミングができるかどうかは開発にはぜんぜん関係ないし、むしろ変な癖の強いコードを書かれるとたまったもんじゃない」みたいな論なんですが、そんなのどうでもいいじゃないですか。
現に私は将来のことなんてまったく考えずにゲームとして楽しいからやっていて、ほかの人も同じような感じでコンテストに出ていることは多いです。情報系かどうかとかもまったく関係ないです。現に自分は農学部に進学予定で「最先端」とは何だったのか感をいろいろと見せ付けられています。

最初からゲームだと思って参加する人は、こういう議論はまったく無視していていいと思います。

あ、あと競技プログラミングをしたいからという理由だけで情報系の学科とかに行くのはやめたほうがいいです。

ゲームらしさ

競技プログラミングを取り巻く環境も、最近結構変わってきています。AtCoder社による日本語の定期コンテスト、とくに初心者向けのAtCoder Beginner Contestの登場により、いわゆる「ビギナーモード」が登場し、初心者が入りやすい環境ができてきています。

それから、ゲームらしい楽しみ方ができるサイトも整備されるようになってきました。
AOJ-ICPC

こんなサイトが登場していて、クリアマークを増やすような感覚で問題を埋めていくことができるようになりました。しかもこのサイトすごいんですよ、数分間隔で更新されるんです。このツールはもろにゲームとしての側面を意識していると思っています。
問題を難易度表で管理することについて - ir5は引退した - TopCoder部 関係者による記事

あとよく調べたら、このAOJというオンラインジャッジそのものでも実力をうまく表していそうな八角形のグルーヴレーダー的なものを見つけました。
AIZU ONLINE JUDGE
(残念ながらこっちは更新頻度が不明でかなり低いです。もっと高頻度で更新してくれたら絶対これハマる人いると思うのに。)

あと、音ゲーではいつの間にかあって当たり前になった大体の実力を表す称号的なもの(皆伝とか足神とか名誉師範とか…)というのもちゃんと競技プログラミングでもあって、海外のTopCoderCodeforcesというオンライン定期コンテストでは参加するとレーティングが変動し、
TopCoder Member Profile
こんな感じで色が決まっています。赤がもっとも強いですが、その中でも特に強いのがtargetと呼ばれています。

はじめかた

  1. 環境の用意をしましょう。自分が使っているのはWindowsのパソコンなので、cygwinをダウンロードして適当にうまくインストールしました。macLinuxの人はもっと楽だと思います。あとエディタを適当に用意しましょう。別に怖いやつじゃなくてもいいです。自分はNotepad++を使っていますが、お勧めしません。
  2. 最低限知らないといけないプログラミングの知識は、「入出力(整数を出力したり、入力したりできる)」「繰り返し(for, whileを使うとか)」「条件分岐(ifを使うとか)」「配列(a[i]みたいなやつ)」です。オブジェクト指向みたいなのはいらないです。ポインタみたいなのもいらないです(僕もわかりません)。後の知識はやってから取り入れていった方が気が楽だと思います。
  3. AtCoder (アットコーダー)の「AtCoder Beginner Contest」と書かれているものをやっていくのが初心者には一番いいと思います。新しいほうからやっていくほうがお勧めです。後は解説もあるので、最初のうちは解説に頼りましょう。あと無理せずC,Dとかやらないで次々開けちゃいましょう。
  4. 面白そうだな、と思ったらこのAtCoderのコンテストに参加してみたりするといいと思います。練習で結構できてきてもコンテスト本番になると急にうまくいかなくなるみたいなのはあるあるです。
  5. ハマったらこれを買って勉強してみるといいと思います(初期投資)。レッドコーダーになってもまだまだ役に立つところだらけです。
  6. ランカーめざしてがんばってください。練習法はいくらでもネットに書かれている上、自分で手探りでもいいと思います。

オイシイところ

いかにもなやつ

海外にも行けます(めちゃくちゃ盛り上がる順位表開け)
ACM ICPC World Finals 2014 Scoreboard Reveal - YouTube

高校生向けのやつ
第26国際情報オリンピック 台湾大会 速報

布団を作れるほどたくさんTシャツがもらえます
Algorithms Weekly by Petr Mitrichev: This week in competitive programming

おわりに

もう文章書くのいやになった