「競プロ」を意識せずにAtCoderに参加するとこうなる

先週のABC196で緑突入→今週のABC197で維持できたので、 「AtCoderで緑になりました」って言って良さそうだなってなりました。

世にある「AtCoderで緑になるまでにしたこと」を眺めてみた感じ、 良くも悪くも乖離があるので、「体験の共有」を兼ねて普段何やってるかを整理してみようと思います。

前提

  • 職業としてエンジニアをやってる

  • 現在40手前ぐらい

  • プログラミングをちゃんと取り組み始めたのは、概ね社会人になってから

    • 大学では数学系を選考→計算機系の研究室に所属した

    • サークル関連でサイトとかの管理をしていたが、プログラミングというほどではない

  • 会社での今の主な分野は、おおむね次の通り

    • クラウドインフラ系に偏りがあるフルスタック

    • 上記を前提とした、プロトタイプ開発やらライブラリ素振り検証とか

  • 趣味でOSSライブラリ開発してる

総じて「職業プログラマを始めたら、肌に合うのかそのまま趣味プログラマにもなった」といった人物像です

何でやってるか

記事タイトルにある通り、いわゆる種目としての競技プログラミングにはそこまで取り組んでいません。 さらに言えば、まっとうに高度アルゴリズムを習得する意思も余り無かったりします。

じゃ何でやってるの?ってなりますが、大まかには次の2個が目的です。

  • 単純なプログラミング能力の客観指標を持ってみたかった

  • コード実装に関する習慣づけを付けたかった

AtCoderの分布を見る限り、安定的に緑推移ができれば当初の目的は正しく達成できてるかな?言ったところでしょうか。

AtCoder関連でやっていること

ABCに参加する時間を確保して、参加する

最低限の枠組みとして、ABCに参加する時間だけは確保するようにしています。 (もちろん、優先順位の関係で不参加だったりもします)

お、ARC・AGCは無理ゲーなので基本的には不参加です。

ユーザーページを見てもらえればわかるのですが、 基本的には 「A・Bはほぼ問題なく正解」 「C問題は安定的に正解」 「たまにD問題が正解出る」 ぐらいの感じです。

取り組んだ問題で正解を出せなかった分に関して、解説を読む

上記の通りの成績帯のため、 だいたい「D問題に向き合う時間はあったけどACが出ない」という感じになります。 ので、時間があったり忘れていないときは解説を読むようにしています。

E問題以上は、解説読んでも「なるほどわからん」にしかならないので、現状は諦めてます。

簡易的な、スニペットを用意する

標準入力のテンプレートだけは用意しています。

本当はGCDあたりの関数は手元に置いたほうが速度が出るとは思いますが、 「こういうときにはこうする」を脳内のインデックスに残してググるスタイルにしています。

やってないこと

過去のコンテストへバーチャル参加する

よく「○○のためにやったこと」で「1日1AC」みたいなトレーニングがよく上がっていますが、 優先順位的な意味で取り組んでいません。

この辺は色んな向き合い方もあると思うのですが、 少なくともプログラミングの軸足がOSSライブラリにあるうちは、 エンジニアリングリソースを過去問ACのために解くことはしないと思います。

「AtCoderのレート向上」を目的としたアルゴリズム勉強

おおむね同上の理由でこういうこともやってないです。

もちろん、解説読んで単純に興味が湧いたものなどは追うケースもありますが、 純粋に競プロの要素としてのアルゴリズム能力の向上は意図的にやってないです。

まとめ

長々と書いているんですが、 Web系企業のエンジニアのシニア級ぐらいであれば 「継続的に取り組む」さえできれば緑は到達できるんだろうなという感想です。

chokudaiさんの記事 にもあるような、 緑での「エンジニアとしてもある程度の安心感がある」の傍証事例になるのかなと思いました。

おまけ

普段のエンジニア活動の延長線上でAtCoderをやっているので、使用言語は主にこの3つです。

  • PyPy3

    • Pythonで書かれたPython

    • Pythonを使っているので、競プロに強い傾向があるこちらをメイン言語にしています

    • ローカルではCPythonを使って、そのまんまPyPy指定で投稿してます

  • Python3

    • 普通のPython

    • たまにPython vs PyPyでPyPyが遅いケースがあるらしく、TLEになったときに「言語スタックを実質変更せずにワンちゃんTLEを回避できるか」といったときに使う程度

    • 一応PyPy側はCPythonと比較してコアバージョンの追従が遅いので、言語的に楽したい時限定で極稀に使うこともあります

  • Nim

    • ざっくりと書くと、Python風の皮を被ったC

    • 少し前から触るようになって、大分書きなれてきたので、Python組でも速度が出せないときに、手っ取り早く置き換える先として採用してます

    • 1回だけこの小手先で突破したような記憶があります