utsubo’s blog

競技プログラミングとか.

競技プログラミングをだらだら5年くらいやってみて

特に対象読者も決めていないクソポエムです。
思いついたことから書いてるので、まとまっていません。

競技プログラミング自体の説明はこの辺を読んでください。
競技プログラミング - Wikipedia

竸プロは青春

私も途中全くやってない期間とかはあるものの大学時代のかなりの時間を竸プロに捧げたと思います。さすがにゲームとかニコ動の時間の方が長いですけどね。

卒業という良い節目なので、竸プロを通して振り返り、何を学んだかなどをだらだら書こうと思います。

竸プロとの出会い

私が竸プロを始めたのは学部1年の後期くらいからです。
その頃は今ほど竸プロは知られてなく日本のコンテストサイトとして有名なAtCoderがちょうど出来た頃だと思います。

当時の私は、プログラミングに関して授業レベルでは困ることはなかったのですが、外に出たら通用しないのだろうなと漠然とした不安を抱えていました。
そこで、目標にするためと自分のレベル感を測るために、プログラミング系のコンテストを漁っていたときに見つけたのが、竸プロでした。U-20プロコンとかも出てみたかったのですが、アプリを作り切るのは私には無理でした。
(余談ですが、プログラミングでやりたいことがないなら、とりあえず自分の興味に応じてコンテストに出るのが良いと思います。竸プロに限らず、セキュリティ、データ分析、障害対応とか色々な分野のものがあるのでね。http://cocodrips.hateblo.jp/entry/2015/10/11/114212)

初出場コンテストはtopcoderなのですが、レートは942でした。
全体のレート平均のちょい上くらいなので、初めてでこれは結構自分賢いんちゃうと思ったのと同時に、僕はこの程度じゃないだろ(?)と続けるしかなくなりました。
“ある種の”頭の良さを評価されるので、闇が深い。
普通に数学パズルとしても好きだったので、長く続けることになりましたね。

ここまで長続きした趣味は、中学時代にハマってたゲーム以来なのですが、要因として初期段階で周りにやってる人がいなかったのも大きかったと思います。
プライドだけ無駄に高い人間なので、大学とかで同時期に始めた人がいて、負けてたら続けてないですね。おそらく。ライバルがいてめっちゃ成長したって人もいるし、なんとも言えないけど。

自分とのマッチングや周りの環境など色々あるので、この時期に自分に合ったものと出会えたのはなかなか幸運だったなと思います。

それからしばらく

滑り出しはまずまずだったものの、それから1年くらいはレートが全く上がりませんでした。あまりに悔しくてコンテスト終了後に泣いた覚えがあったりなかったり。

この1年くらいが一番情熱があった時期で、再帰を理解できるまで散歩とか、深夜でもコンテストに出るとか、授業中も問題を解くとかやってました。なんだかんだ”やってる感”があって楽しかった。

やってる感に浸って、コンテスト中に解けなかった問題を解き切らずに放置していたのが、伸びなかった原因だと思っています。復習が嫌いなので…
体系的に勉強する必要はないけど、復習はしっかりすべきでしたね。

現状のレベルでは、解かなくて良い難しい問題も存在して、その辺の見極めが難しいですね。
最近は、公開されている解説を読んで意味不明な問題は飛ばす方針でやっています。(この辺は数学系の本も同じだと思っていて、難しすぎる本は飛ばします。)

数年振りに解いてみると解ける問題もあったりしたので、諦めは結構肝心だと感じます。
遮二無二解くことより、適切な難易度の問題を解くのが重要だと思うのですが、適切な難易度の問題を探すには、結局沢山解かないといけない…

思考法

一応、だらだら続けている内にtopcoder, Codeforces, AtCoderでは青コーダー(中堅くらいの実力?)になれました。
これまでに解いた問題数は、900問くらいみたいです。

続ける中でアルゴリズムやデータ構造の知識が増えたのはもちろんなのですが、雑に言うと昔より頭が良くなったと感じます。
頭の良さにもいくつかあると思うのですが、特に問題を整理する力、考察力が向上したと思っています。

私は、下の2つプロセスを意識して問題を解いています。
① 問題の性質を書き出す
② 性質の考察を進める、複数の性質を組み合わせて解けないか考える

①については、例えば、「判定問題として考えると…」、「この部分は貪欲に解けるから…」、「小問題が解けていると仮定すると…」とかです。
こういう具体的なアルゴリズムにまでは至らない考察や、”部分的に問題を解いていく”のが、少し得意になったと思います。前は一気に解ければ解ける、そうでなければ解けないみたいな感じだったので。

②は、問題が複雑になってくると必要だと感じています。難易度としては、AtCoderで500点くらい、これ以上難しいと私も解けないんですけどね。

部分的に問題を解いた後に、全体が解けるように穴を埋めていきます。穴を埋めるには、部分的な考察を広げていく中で、不足している考察をひらめくしかないと思っています。
天啓が来ないで行き詰まると「ここまでは解けてるから考えなくて良い。」みたいな独り言をよく吐きます。考える必要のある部分に集中してるんですかね。

この辺の反復練習から、どこまで理解できていて何を考えないといけないのか整理する能力が上がったと思います。
僕はこれが非常に苦手で既知の部分を何度も考えて空転することがいまだに多いです。

まず、これが苦手だとに自覚したのは最近で、こういうのは得意だと思っていたので、自覚できただけ良いと思っています。
競プロに限らず、大きな問題に直面した時に、小問題に分割できず、フリーズしてしまう癖があるので矯正していきたいですね。

竸プロerは自己評価が低い

に関して二言三言。

知性で殴り合ってる感が強く、レートという形で定量的に能力が測れてしまう竸プロなので、卑屈になってしまうのかなぁと思っています。レート以前に解けなかった問題が異常な速さで大勢に解かれていると悲しいし、悔しいですよね。

定量化しないでいた自分の弱さとか無能さと向き合うことになるので、私のような自分のことをそこそこ賢いと思っている人間には、ちょっとつらい。

こんなのやってるの頭が良い人しかいないんだから、ヘコむ必要は全くないのですが、足ることを知るというのは難しいですね。

悔しさ駆動精進も捗るので、卑下の全部が全部悪いとは思いませんが、ほどほどにね。これは自戒も込めて。

学生を終えて

学生時代を振り返ると競プロがなければ本当に何もせず終えていそうだったなぁと思います。
会社見学やインターン、オンサイトのコンテストなど競プロ経由で様々経験させて頂きました。
学内でLTやったり、ハッカソンやったりしたけど、それも結局、”私は”競プロを通してそういうものがあると知ったのでね。
果ては就活も競プロのおかげと言って過言ではない。

振り返ると、競プロにもっとドハマりした方が良かったかなという想いと、色々と技術的な事やそれ以外も広く浅くやったこのままでもまぁ悪くなかったという想いが半々です。
けど、青コーダー止まりであれば、もう一つ何かしらで青コーダー相当の武器を作った方が気持ち的にも有利に進められそうだったなぁというのが就活等々を終えての所感です。(技術力に限らずコミュ力でもアピール力でも本当に何でも良いのですが)

これから社会人になりますが、学んだことを活かしつつ、けどこだわり過ぎず、バランス感覚を持って視野を広く、色々やっていきたいと思います。

まだ、何か吐き出しきれてないものが見つかれば追記します。
以上、読んでいただきありがとうございました。

P.S.
競プロに情熱ある風でここまで書いてきましたが、最近は熱も冷めてきて何か他のおもちゃを探しているところです。