えるざっぷの日記

えるざっぷの日記とか

ACM-ICPC 0完でも競技プログラミングがしたい!

ACM-ICPC 2017 Asia Tsukuba Regional | ACM-ICPC 2017 Asia Tsukuba Regional 358組中43組の国内予選を通過し、アジア予選に参加してきました。

まず結果について

0完(1問も解けなていないこと)についてはショックが大きいです。汚点を残したとか、期待を裏切ってしまったとか結構考えさせられました。他校からすると全然気にならないかもしれませんが。帰って寝るまで辛かったです。起きたら元気でした。

毎年直前になんとか集まるグループ

自分の大学には競プロサークルなどは無いです。 毎年ACM-ICPC参加登録 1ヶ月前くらいに誰か一緒に参加してくれる人を探して、僕の趣味に付き合って貰う形で出来たグループで挑戦しました。 今年の国内予選は僕にとってはラストで、3回目にして始めて通過しました。 電機大から一昨年は1グループ、去年は3グループ、今年はなんと6グループ集まりました。

なぜ0完だったのか

単純な実力不足です。 コンテストの経験不足、英語コンテストへの挑戦回数が全く足らなかっただけです。 結局実力はそれに費やした時間です。

冷静に取り組んでいればA問題は絶対解ける問題でした。 思い返すと言い訳ばかり書きたくなってしまうので書かないでおきます。

VMが配られていたので本番環境で練習しておいたのは本番であたふたせずにすんでよかったです。 ただやっぱりどんなに焦っていても休憩は入れるべきでした。(競プロにかぎらず)

失敗から学ぶべきものは何もないので、今まで競プロをやってて思ったことをまとめておこうと思います。

初心者から見た競技プログラミングについて

僕の競プロ歴は4年(冷めてる期間多すぎて実質6ヶ月くらい)です。そんな自分からみた競プロについて書きます。

自分の好きな言語で解きたい

競プロに使うプログラミング言語ですが、自分の好きな言語で挑戦したいです。競プロ楽しいと思う部分はアルゴリズムやデータ構造を使って設計、戦略を考える部分です。知らない言語の仕様について勉強するのは僕にとっては無駄な時間に感じました。

ドキュメントやノウハウが充実するためにはプログラミング言語が偏っているのがしょうがないかもしれません(あとは実行速度など)。オンラインジャッジサービスだと様々な言語が充実していることや ACM-ICPC でも Python が使えるようになったのはいいことだと思いました。

問題文の英語について

英語力と競プロは両立はしたくなかったです。 コンテストなどでグローバルに平等性をもたせるために問題が英語なのはしょうがないことですが。

普段から英語のドキュメントは読むので特に抵抗はないです。 でも問題の「文章」を理解するためにかける時間は無駄に感じました。

AtCoder では多言語化にも力を入れていて素晴らしいと思います。僕は昔 AtCoder で競プロを知ったのですが、問題が英語だったら触ってなかったかもしれません。

快適にコーディングしたい

競プロなのに Lint や変数名や保守性などにこだわるつもりは無いですが、最低限のデバッグ環境は必要だなと思いました。 構文チェックやInspection(未使用、未定義、型とか)があったほうが全然集中しやすいです。

そのへんは言語ごとに IDE があれば問題ないです。ただ Mac, C++ の(この組み合わせだけかもしれませんが)デバッグ環境を整えるのは大変でした。

理想を言うとデバック環境やサンプルケースの自動テスト(test ファイルの配布など)環境も欲しいなと思います。ちょっとした CLIを作ったりもしました。 競プロでサンプルケースをテストするCLIを作った - Qiita

そのへんは TopCoderCS Academy は提出前にサンプルケースのチェック出来て、ブラウザエディタの発展による解決もありかなと思いました。

競プロの勉強の仕方について

周りにやってる人がいないのもあって、なかなか学習の道しるべが見つけられませんでした。

簡単な問題への挑戦やコンテストへの参加への敷居はすごく下がっていて素晴らしいと思います。誰でも Online Judge ですぐに始めることができます。

ですがそこから先の勉強方法がなかなか見つかりませんでした。 最初は AtCoder の解説で初めて聞いた名前があると調べるなんてことを繰り返してました。 最終的に基礎的なアルゴリズムのリストアップは AIZU ONLINE JUDGE: Programming Challenge がまとまってたかなと思います(僕が知る限りでは)。

本で勉強できない自分が悪いのは別の話になってしまうのですが、蟻本などは最初の方だけ読みませんでした。 モチベーションの話にもつながるのですが分野によってはオンラインのドキュメントが充実しているので、自分にとってはそこが勉強のしやすさの差を感じてしまいます。

たとえば↑はとても欲しいなと思います。

github.com

↑こういうロードマップの競プロ版が欲しいなと思います。

github.com

↑ここをみても、コンテストやオンラインジャッジのサービスは充実してるけど知識は書籍が主流なのかなという印象もあります。

本当に競プロの入門についてのドキュメントなかなか見つけられませんでした。 いろいろ欲しいと言っていますがまだ出会ってないだけの可能性をずっと感じています。 競技プロサークルは羨ましいなと思います。

モチベーションについて

競プロをやっていて「楽しい!」「この問題おもしろい!」と感じる瞬間は確かにあるのに、勉強がなかなかつづきませんでした。

継続のモチベーションで言うと AtCoder problems などがとてもよかったです。AOJもそうですがやった問題ははっきり色がついてるとわかりやすいし埋めてくのが楽しくいです。

大学に競プロのコミュニティが無いですが、2016年の春は学内で勉強会などを何度か開いて講師をしました。https://github.com/elzup/tdu_procon_lecture 勉強会も続きませんでした。

競技プログラミングの意義について

競プロのスキルが就職で優遇されるのを見かけるようになった来ました。 しかし競プロで得た知識が実用できたという話のはあまり聞きません(機会がないだけかもしれない)し、なぜ優遇されているのかわかりません。

自分は競プロの問題を解くのが楽しいのでやっていました。 きっかけとしてはいいと思いますが、就職で有利になるために競プロを勉強するのは辛いだろうなと思います。

競プロで身につけた知識が研究に役立つのかわかりません。その実感はまだない段階で、自分には機会がないかもしれません。 ただ問題に合わせてシンプルなデータ構造を捉えられたとき、トリックを発見したとき、実装してACしたときの達成感が好きです。 今の自分にとっては競プロは趣味でしかないので他のことを優先するし、このペースやモチベーションだとなかなか成長しないと思います。

4年間やっていて競プロはモチベーションの波は激しくて今は小さいです。

ここまでダラダラ書くつもりはなかったのですが、意外と競プロについて思うことが多かったみたいです。

ACM-ICPC を終えて思うところがたくさんあったので今の自分の視点として残しておきます。 競プロのつながりを持っていないのでフィードバックがあれば嬉しいです。