AtCoderで青色になった

7月7日のAtCoder Beginner Contest 133で青色になりました。青色というのは上位7%に相当するらしいです。

「水色に上がった」記事からまだ1ヶ月ちょっとしか経っていないので、新しいHaskellネタも「青色に上がるためにこれを勉強した」みたいなネタもないのですが、適当に自分語りでもしてお茶を濁そうと思います。

現状と課題

正直行って前回のABCで青色になったのはまぐれです。すぐに水色に転落すると思います。

(……とかブログの下書きに書いている間に、7月14日のAGC035で結構レートが上がりました。すぐには水色には転落しないと思います。)

自分の強みですが、解ける問題(ABCのAからDなど)を早解きするという面では他の人[誰?]よりも優位に立っている感覚があります。一方、知識不足・経験不足で解けない問題も多く、そういう問題で他の人と差が出ると順位がだだ下がりします。

なので、当面の目標は、知識・経験を積んで解ける問題のバリエーションを増やし、青色を維持できるようにすることです。とりあえずは新生ABCのE, Fとか、ARC相当、AGC等の過去問をやっていきたいです。

自分語り

過去編

競技プログラミング(プログラミングコンテスト)と最初に出会ったのは学部1、2年の時(7、8年前)に受講した「実践的プログラミング」という講義(学生が手を動かす時間が大半なので講義というには語弊があるが、仮に講義としておく)でした。私は大学入学前からプログラミングが得意だったので、「プログラミングしてると単位がもらえるじゃんラッキー」という感じで受講していました。

この講義はICPCに出る人を育成するようなやつで、各回ごとにアルゴリズムの解説や過去問の出題があって、受講生が解く感じだったと思います。ジャッジはどうしてたっけ……。

使用言語は、ICPCで使用できる言語の中で私が一番得意なのがC++だったので、C++を使っていました。

具体的なアルゴリズムとしてはUnion-FindとかWarshall-Floyd法、Dijkstra法などを実装した覚えがあります。講義で推奨されていた蟻本(当時は初版)も買いました。(ただ、ここで知ったアルゴリズムの大半はその後の空白期間で忘却しましたし、当時買った蟻本初版も今では行方不明です)

ICPCは3人でチームを組んで参加する感じなので、プロコン仲間がいない人には厳しいです。しかし、もともと仲間がいない人でもこの講義の受講生同士で組めばチームとしてICPCに参加できます。というわけで、学部2年の時にチームを組んでICPC予選に参加しました。私は幾何の問題を解いた記憶があります(私自身はその1問しか解けませんでした)。

ところでICPC国内予選は各大学から本選(?)に出られるチーム数が決まっており、競プロ強者がひしめく東京大学というところは私のような非ガチ勢にとっては相対的に不利です。当然、予選突破はなりませんでした。

ICPC以外のプログラミングコンテストですが、当時はAtCoderはありませんでした。強い人はTopCoderとかCodeforcesをやっていたんでしょうか?私は当時オンラインのコンテストに日常的に参加するということはありませんでしたが、Google Code Jamには参加した記憶があります。

ただ、実プロで1年半競技プログラミングをやっても、結局私は競技プログラミングに楽しみを見出せませんでした。理由はいくつか考えられます。

  • 私がプログラミングをやる理由というのは「何かを作るため」「自分の考えている問題を解くため」であって、「誰かに与えられた、想定解の存在する問題を解く」という行為にあまり価値を見出せなかった。
    • ついでに言うと、C++でマクロとかを駆使して「汚くてもいいから早く書く」という風潮が好きではなかった。
  • プロコンにおいて自分が上位に入れないとわかった。上位陣の強さを思い知ってしまった。
    • 高校の頃は日本数学オリンピックに参加したりしていましたが、モチベーションを失わなかったのは「身近に上位陣がいなかった」という要素が大きいかもしれません。身近にメダリストなんかがいたら戦意喪失してたかも…?

AtCoder普及以降

ここ数年になって、AtCoderの普及のせいか身近な人(数学科繋がりの人、その他ツイッターで相互フォローの人)がプログラミングコンテストに参加しているのを(ツイッターで)見かけるようになりました。オンサイトとか楽しそうですね。彼らが良い成績を出せるなら自分も参加すればそれなりの結果を出せるのでは、と内心思っていました。

そんな折、フィボナッチ数の記事を書いたら関連するAtCoderの問題としてTDPC-Tを紹介されました。TDPC-Tはかなり難しい問題(?)らしいので、それを解けたということは「俺結構いけるのでは」と思い始めました。(解くのにかかった時間には目を瞑る)

その後、自分の実力を試すために他のTDPCの問題や、直近のコンテストの問題を解き始めました。でも、どうせ問題を解くなら、競技時間中に解いて自分の実力をレートとして数値化したいですよね。というわけで、AtCoderのRatedコンテストに参加するようになりました。

自分にとっての競技プログラミングの意義

一度辞めた競技プログラミングを再開したということは、競技プログラミングにそれなりの価値を見出せるようになったわけです。その辺の自分の考えも書いておきます。

まず、上位が云々という点に関しては、AtCoderの普及によって(?)観測範囲の競プロ人口が増えたので、トップの人たちには遠く及ばないまでも、全体から見ると比較的上位に入れるようになった気がします(全体とは)。なのでこの点は解消です。

さて、プログラミングに関して私はこれまでOSS活動やブログ執筆等をやってきたわけですが、これらを通して自尊心や承認欲求を満たすのは大変です。OSS活動やブログ執筆でこれらを満たすには、GitHubのスターやQiitaのいいね、はてブ等を獲得する必要がありますが、これらの数というのは内容よりも「バズらせる能力(あるいは運)」の方に依存するのは皆さんも良くご存知のはずです。

一方、プログラミングコンテストはその人の実力(問題を解くスピード)だけで順位が決まり、レートが数値化されます。宣伝の上手さとかTwitterのフォロワーの数とかは関係ありません。そうすると、レートを上げることによって自然に自尊心や承認欲求を満たすことができます。これは(レートが上がれば)非常に精神衛生に良いです。

あと、大抵のゲームがそうだと思いますが、努力が実を結ぶという点も重要です。もちろん個々のコンテスト結果については運の要素もあるとは思いますが、長い目で見れば競技プログラミングは努力が実を結ぶ活動だと思います。減免が下りない授業料免除申請や理由もわからず落とされる就職活動、スポーツ好きでもないのに問答無用で迷惑が降りかかってくるオリンピック開催など、理不尽に溢れた世の中において、努力が実を結ぶ活動というのは貴重です。

まあそうは言っても、競技プログラミングはあくまでゲームの一種です。100m走がスポーツの全てではないように、数学オリンピックが数学の全てではないように、競技プログラミングもプログラミングの全てではありません。プログラミングに関する他の活動も続けつつ、ほどほどに頑張っていきたいと思います。

色について

世の中の男性の20人に1人(要出典)くらいは色覚異常というやつで、一部の色がぱっと見で区別できません。競プロのレーティングは色で表現されることが多いですが、その中にも「見分けづらい色」があります。具体的には茶色と緑色です。(色覚異常の中でも個人差はあると思うので、以下は私の場合です)

色覚異常といっても全く色がわからないわけではなく、記事の最初の方に貼った画像の400から800までと800から1200までが微妙に違う色だと認識できるのですが、どっちがどっちか自信がありません。記事冒頭に貼った画像の場合は「レーティングが上になるほど彩度が上がっていくはずだから、上が緑かな?」みたいな考察をすれば判断できますが、あまりスッキリとはしません。

ついでに言うと灰色と水色も見分けづらい組み合わせですが、競プロのレーティングの文脈でこれらを混同することはあまりないので、茶色と緑色ほどには問題になりません。

というわけで、もうちょっと色を調整するか、文字情報として「緑」「茶」などと書いておいて頂けるとありがたいです>AtCoder運営様


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です