hibitの技術系メモ

数学とか3Dとか翻訳とか

AtCoderで緑コーダーになりました

f:id:hibit_at:20200518180931p:plain

f:id:hibit_at:20200518180907p:plain

 先日のABC168で無事緑コーダーとなりました。「緑コーダーになるまで何をしたか」という記事はありふれているので、特に新規性のある内容が書けるとは思えませんが、一区切りとして。

あまり書きたくなかった

 最初からこういうこと書くのも何ですが、この記事を書くにあたってあまり気は進みませんでした。なぜなら、自分なら緑コーダーぐらいなら一瞬でなれると思っていたのに、半年以上かかってしまったからです。自分は頭良いと信じていたのに。打ち砕かれる希望。突きつけられる現実。厳しい。

 一応、自分の相場感、実際の問題、誰かが始めるにあたっての意見を書いておきましたので、参考になれば幸いです。

インフレしている気がする

 前提として、AtCoder全体がインフレしている気がします。社長の記事によれば緑は、

chokudai.hatenablog.com

学生ならかなり優秀。 エンジニアとしてもある程度の安心感がある。論理的に複雑な処理の実装に対応できない、なんてことはなさそう、くらいには思える

 ということですが、このツイート時点から参加者はほぼ倍増しており、教材も世に溢れています。今となってはbit全探索やDFS、BFSは茶でも組めて当たり前といった感じです。AtCoder Problemsで昔の問題をやると明らかに表示難易度に比べて簡単です。というか私が始めた時と比べても水準が上がっているような気がします。気のせい?

 緑でもレベルが高い、というのは自分弁護のための恣意的引用のようで気が引けるのですが、この記事で述べられていることは概ね同意できます。

学生でもエンジニアでも、このレベルに到達できたのならとても優秀です。そして、ここから先は趣味の領域になります。

www.pc-gear.com

自分のレベル

 プログラミングは好きでしたが、c++は初めてでした。Pythonなら多少心得があったのですが、計算時間が厳しそうということでc++をイチから始めることにしました。

atcoder.jp

 これをやりました。なので自分のc++競技プログラミング専用です。

 数学は得意だと思っていましたが最近はよくわからなくなってきました。いや、今でも得意だと信じているのですが……。実力の程はブログの過去記事などを読んでいただければ。以下の記事がおすすめです。

deux-hibi.hatenablog.com

deux-hibi.hatenablog.com

頭の良さだけで押し切れるか

 競プロを始めたいという人にとって、自分の潜在的な思考力がどれぐらい通用するかというのは気になる点だと思います。これについては「センスだけでいくなら相当の頭の良さが必要」という感じでしょうか。AtCoderはパズル的な問題が出やすく、本質さえ分かれば数行で正解、というのも問題によっては可能です。

atcoder.jp

 例えば、これはD問題ですが数学的考察により数行で解くことができます。

atcoder.jp

 これはE問題ですが同様です。

 こういった問題達を見逃さずに瞬殺できれば、コーディングの練習を積まずとも、センスだけでも緑より上、水色や青になれる可能性はありますが、きわめて高い水準を要求されると思います。もしあなたが数学オリンピックに出場できるぐらいの数学力があればさすがに心配ないでしょう。私はそこまでではなかったので、結局真面目にトレーニングする羽目になりました。

慣れが必要

 やはり競プロは競プロという独立したスポーツです。数学力やコーディング力と少なからぬ関係はありますが、そこで成績を出すには競プロというフォーマットに慣れる必要があります。入出力を受け取って、アルゴリズムに落とし込み、計算量を見積もって、実装する。コンテスト本番で安定してパフォーマンスを出すためには、ある程度問題を解いてコンテストを経験することは必須です。別の言い方をすると、簡単な問題であれば反射的に典型問題に落とし込んで無表情で瞬殺できるようになる必要がありますし、その幅をどんどん広げていく必要があります。

atcoder.jp

 例えばABC167で出たこの問題は愚直な全探索で、本番もわりと落ち着いて解けたのですが、これを迷いなく実装するにはけっこう慣れが必要ではないかと思います。ていうかこれで茶diff前半なの……。

 あと、一般的な数学力とは別の「競プロ用数学力」ともいうべき概念が存在すると思います。以下の問題は単純な組み合わせなのですが、扱う数が大きいので逆元の実装が必要です。慣れないとけっこう大変。

atcoder.jp

競プロが役に立つか

 実務に役に立つかと言われたら、超専門的な業務を除いて、それほどならないだろうなと思います。競プロではアルゴリズムを洗練させて実行時間を2秒以内に収める必要がありますが、現実には10分かけてコードを改善するより計算機に10分多く計算させた方が合理的な方がほとんどだと思います。

 もちろん完全な無駄ではなく、計算量の肌感覚が身に着くので「これは冗長な計算をしてるな」とか「この多重ループは気持ち悪いな」とかがわかるようになります。わざわざ配列や変数を新しく定義せずとも目的の値を見つけ出す最短ルートを見つけ出せますし、複数の添え字の動きを頭の中でイメージしながら、エラーを出さずにループを構築させることができます。

 しかしそれらのようなことは開発全体から見れば一部の部分であり、現実には環境構築で躓かないか、とりあえず動くコードを作れるか、スクレイピングや学習に回す時間を何時間確保できるか、といったことの方が、開発においては重要な場合が多いかなと思います。

競プロ自体を楽しいと思えるか

 ともあれ、「ここを超えられないと自分的にヤバいだろ」というラインは超えたので一安心です。最近のコンテストでも水パフォは何回か出ているし、この半年でかなり基礎を固めた感はあるので、このペースで努力を続けていけば水色になれるだろうという感触はあります。ただ、この「努力」というのは、難問のAC、(恐らく業務では使わない)ライブラリの実装訓練といったものもを含む地道なものです。それだけのモチベをこれからも維持し続けられるかはわかりません。他のことに時間を取られてしまうかもしれないし、そもそも問題を解くことが楽しく思えなくなってくるかもしれません。

 やはり重要なのはパズルを楽しめるかどうかではないかと思います。意識が低いかもしれませんが、今でも灰diff中盤~茶diff中盤あたりをなんとなく解いている時が一番楽しいかもしれません。問題に集中できている時は無心になれるので、これだけの環境を用意してくれたAtCoder社には感謝に堪えません。

 上で「緑にならないと自分的にヤバいだろ」と述べましたが、例え灰色でも、問題を解きながらACを重ねている限りその人は立派な競技プログラマなのだと思います。今後何かのきっかけで急成長して青や黄になっても、その思いは変わらないと思います。

 これからも精進していきます。