# AtCoder で水色になった
2025年 2月の ABC394 で、AtCoder でのレーティングが水色に到達しました。アルゴリズム部門での水色以上の人数割合は [レーティングのしくみ - AtCoderInfo](https://info.atcoder.jp/overview/contest/rating) によると、2023 年時点で 7.6 % 程度です。
プログラミング言語は Haskell を使ってきました。Haskell で水色以上のプレイヤーは数えるほどしかおらず、現在もコンテストに参加している人に限れば私が知る限り 5名程度です。その中に自分も入ったことになります。
![[スクリーンショット 2025-03-02 14.56.06.png]]
水色になるためにどのぐらい問題を解くべきかとか、どんな学習が有効かといった話は、過去に入水した方々が語ってくださっているので、そういう話はおいておいて、ごくごく個人的な自分語りをしていこうと思います。
わたしの自分語りに興味がない方は、ここでそっとブラウザを閉じていただけると助かります。
## モチベーション ─ 自分自身の答え合わせ
もともと AtCoder を始めたのは、どちらかといえば Haskell を書けるようになるためでした。特に作りたいものがなく、実装の題材として競技プログラミングの問題はよさそうだな、ぐらいの気持ちで始めました。
競技プログラミングにはもともと苦手意識があったこともあり、コンテストに参加するということは、当初は考えていませんでした。
この苦手意識とはなんだったのかと言えば、他人と競争することがあまり好きではないとか、若いころに少しやってみたら全然解けなかったとか言い訳はいろいろあるのですが、今思えば、自分の実力というか適性というか、それが可視化されることへの恐れだったんだと思います。
人にそれを見られるのが恥ずかしいとかそういうことよりも、自分で自分の実力を直視することになるのが怖かったんです。
自分のプログラマとしてのこれまでのキャリアは比較的順調で、トラックレコードも幾つかあるし、胸を張って良いものなのかもしれません。その一方で、サービスを自分で作ったとか、大規模なシステムを構築したとか、そういうことは往々にしてチームで成し遂げたことでもあるし、果たして本当にそれが自分の能力によってなし得たことだったのかは自分でもわからないことがありました。メンタルの調子が悪いときには「いや、自分はたまたま運が良かっただけだ」と考えてしまうことも頻繁です。
何かしらの実績が蓄積されればされるほど、果たして自分には本当にプログラマとして十分な実力があるのだろうか? ということに向き合うのが怖くなっていったように思います。若い頃はとくに何も自分にはなかったから無鉄砲にいろんなことにチャレンジできていたのに、だんだんと、失敗により実力が露呈してしまうようなことにわざわざ挑む必要はないと保守的になっていく。失敗した自分を他人に見られたくないから、ではなく、自分自身が自分はそんな程度だと認めることになるのが怖くて手がでなくなっていました。
それでも競技プログラミングのコンテストに出て、ちゃんとやってみるかと思ったのは、うっすらと過去への後悔があったからです。
自分はこれまで、何かを納得のいくまで時間を注いで努力することができてこなかったと、ずっと思っていました。それがコンプレックスでした。
学生のころはスポーツをやっていてそれなりに時間を費やしはしましたが、やり切るところまでやったかというと、怠惰さにかまけてそこまではいかなかった。大学受験も、それまでスポーツに明け暮れていたこともあって、懸命にやりはしたものの十分な時間を注ぎ込むことができずに本番を迎えました。当時はまだインターネットもなく田舎にいたこともあり、東京の人たちがどれぐらいの時間と努力をそこに費やしているものなのかも、あまりよくわからないまま時間を過ごしました。社会人になって以降も似たような感じで、そういうことが多々ありました。
いいえ、これも本気で取り組めなかったとか時間が足りなかったとか言って、相応の実力が自分にはなかっただけ、そのことを直視せずに済むよう、自分に言い訳にしてきただけなんだと思います。
なんだか自分の人生は、こうやって自分に言い訳をしながら、誤魔化しながらここまで来ている。この歳になるとさすがにそういうことが分かっていました。
いつからか、こういう感覚をこの先もずっと抱えたまま生きていくのは、もう嫌だなあと思うようになりました。こと頭を使うことに関しては、いまここで本当の自分がどの程度なのかを見定めることをしなかったら、将来「もう若くないから」とずっと言い訳をしそうだ、そんな予感もありました。ちゃんとやったときの自分はどんなものなのか、それを今さら見るのは怖い一方、それをみないまま過ごしたあとの方が後悔は大きそう、そう思える程度には、残り時間がそんなに長くもないなと感じていました。
まあ、そんなわけであるとき思い切ってコンテストに出てみたわけです。ABC300 だったと思います。
ここで初回から華々しい結果を残せたら、これまでが自分の思い過ごしだったね、で話は簡単だったのですがそうはいかず。こういう余計なプライドに塗れている人間というのは実に弱いもので、コンテスト初回は緊張のあまり全く頭が回らず、A 問題 1 問しか解けないという結果に終わりました。90分近く頭が真っ白になって、椅子に座ったまま固まっていたのを、いまでもよく思い返します。
結果としては、それが良かったのかもしれません。そういう苦い経験が、余計なプライドを少し脇に置くために必要だったんだと思います。
そこから2年ぐらいコツコツと練習を続け、週末のコンテストには可能な限り出場しつづけて、当初から目標としていた水色に到達することができました。地道に努力をすればある一定の領域までは自分でも到達できるんだということがわかり、ようやく自分で自分の答え合わせができた、いまはそんな気持ちです。
## 能力のせいにしないメンタリティ
コンテストへの参加を続ける中で、スコアが伸び悩んだり、大失敗でレートが一気に下がったりということは過去何度も経験しました。
そのたび「自分の能力はここで頭打ちなのではないか?」という疑問がもたげてくるわけですが、ある一冊の本に書かれていたことが、能力のせいにしたがる自分を「いや、そうではないはず」と引き戻してくれました。
そこには、成長が止まったように感じるのは能力の限界ではなく、それは単に次のブレイクスルーを迎える前の停滞期に過ぎないということが書かれていました。
[『私たちはどう学んでいるのか』鈴木 宏昭 | 筑摩書房](https://www.chikumashobo.co.jp/product/9784480684318/)
いわく、どんな一流のスポーツ選手であっても、停滞期··· いわゆるスランプとそうでない時期を繰り返しながら成長していく。スランプというのは、それまでの自分のやり方の中に部分的に新しいプロセスを導入するがゆえに、プロセスの連鎖の最適化が崩れた一時的な状態である。プロセス全体は一時的に不安定になるが、活動を続けることで再度の最適化がなされて次の段階に入る。そして飛躍につながる。このプロセスの最適化が自分の身に起こる瞬間は、人間は自分で認知することができない。
ということでした。この本からは、本当にたくさんの学びがありました。
競技プログラミングは、新しくできることを増やして強くなっていくのと同時に、自分ができないことを直視してそれを修正していくことが必要な競技です。それはプログラミングスキルだけに留まることではなく、慌てて問題を解こうとするあまりちゃんと考えられていないとか、問題文の読解が足りていないとか、小中学校レベルの算数の意味を実は理解できていないとか、覚えたはずのアルゴリズムが覚えた気になっているだけで実は全然だとか、そういう自分自身への誤魔化しみたいなものを地道に取り除いていく作業でもあります。
ときには、本当に基本的なことが長年わかっていなかった、という現実を直視せざるを得ないことも多々あります。正直、うんざりします。自分で自分に失望する辛さをこれ以上味わいたくないという気持ちが、いつしか「自分の能力はこの程度だから」と能力のせいにして線を引きたい欲求に変わるときがあります。
でも、往々にしてそれは能力の問題ではないようです。
「どんなことでも10年やり続けたら才能なんて関係ない」ということを言っている人がいました。
> そんなのはたいした問題じゃない。大事なのはしょっちゅうそのことで手を動かしてきたか、動かしてきていないかのちがいだけです。これは物書きに限らず、何でもそうですよ。要するに手だよ、手の使い方なんだよってね。何になるにせよ、手をたくさん使えば誰でもなりたいものにちゃんとなれます、そういってもいいくらいです。
>
> 職人さんを見れば、わかります。染め物をやれば、余計な染料を洗って落とすために、暑くても寒くても川に入らなきゃならない。そういう作業をたくさんやれば、一人前の染物師になれる。それだけが専門家とそうじゃない人のわかれ目で、ほかのことは全部あてにならないんです。
>
> 誰に才能があって、誰に才能がないとか、そんなことはない。ないと同じなんだよ。ただ、やってなきゃ誰でもダメだよ。やったら誰でもやれます。たくさん手を動かしてると、何かやる時にひとりでに手が動いてくるということがあります。自分の手が覚えてることを、自分でもって納得できるように手を動かすことができたら、いいものができる。
>
> だから、〈量より質〉の反対。〈質より量〉ってことだと僕は思います。僕はいつでもそういう考えですね。それ以外は認めないっていうか、自分に対しても認めないできました。
>
>[10年やり続けたら才能なんて関係ない(吉本隆明『ひとり 15歳の寺子屋』より) ](https://terakoya-juku.com/blog/detail/20241125/)
さすがに「才能なんて関係ない」というのは言葉の綾みたいなところがあって、生まれつき IQ が高いとかそういう適性による差はあるだろうとは思います。
が、自分の目標は何もそういう領域まで到達したいというわけではないし、才能云々はおそらくそういう先の先まで到達したときに初めて問題になることであって、それよりも遙かに手前にいる自分が練習を続けるか続けないかには、たいして関係のない話なのでしょう。
自分に限界はない、みたいな根拠のない根性論を信じるつもりもないし、かといって「自分には能力がない」という安易な能力論にもしない。スランプは飛躍のための準備期間であり、新しく覚えたことや繰り返しやっていることをまだ身体化できていないだけなんだと、落ち込んだときは冷静にとらえるようにしました。
そして量を質に転換させる、Haskell やアルゴリズムを身体化する ··· 自分の脳に刷り込むためできるだけ毎日手を動かす。これを続けてきました。
おかげで当初は競技プログラミングには向いていないかもしれないと疑っていた Haskell も、いまではこれこそが自分にとってベストなプログラミング言語だと思えるくらい操ることができるようになったし (巷で難しいと言われているモナドも感覚で操作できるようになったし)、コンテストに出て間もない頃、水色や青色の人たちが序盤の問題を数分で片付けていくのをみて「あんなこと自分にはできない」と思っていたのに、気づけば自分もそういう芸当が普通にできるようになっていました。
はじめは自分の能力や実力を見定めるためと思って始めたことも、やがて能力で線引きをすることを考えないことが大切だという境地に達し、どれだけ継続できたかが結果に転換される、そして自分はそれを継続することができて、得られたのは Haskell やアルゴリズムをある程度思いのままに操作できる力だった。そんな風に捉えるに至りました。
なんだか水色になって満足しているような内容になってしまいましたが、ここから更に継続していって自分が青色に到達できるのかに興味が沸くようになったので、何年かかるか分かりませんが、引き続きチャレンジしていこうかなと思っています。
もっと色々書きたいことはあったのですが、ここまでで十分にエモすぎるので、それは青色になるタイミングまでとっておくことにします。
長々とした自分語りをここまで読んでくださってありがとうございました。
----
## 四方山
- ライブラリで戦うのか、その場での実装力で戦うのか
- 自分は前者
- ライブラリで戦うということは、オフラインでの実装力が求められる。これはオンラインでの実装力とは別 ··· 抽象化技法
- よくできたライブラリは実装の認知負荷を下げ、考察のレールになる ··· 宣言的プログラミング
- ライブラリで戦うタイプの自分には Haskell はベストな選択
- 一つ一つのアルゴリズムの理解を深める = メンタルモデルの更新
- 各種アルゴリズムに対するメンタルモデルを更新し続けること
- たとえば BFS は、グラフの探索アルゴリズム → 局面の遷移を扱うアルゴリズム → 状態遷移を扱うアルゴリズム → 状態空間は多次元であっても良い、みたいな感じでより抽象的に捉えられれば捉えられるほど、閃きが拡がる
- このメンタルモデルの獲得に Haskell でやってることが大いに役立った
- 意味のあった練習方法
- 同じ問題を間隔を空けて繰り返しとく ··· 記憶で問題を解いてしまうことも多々あるが、100% 無駄というわけではない
- ランダム学習とブロック学習を使い分ける → [[ABC345 振り返り]]
- 確実にできることは認知エネルギーを使わずにできるようになるまで身体化する。そのための反復練習
- わかりきった部分問題は反射で考察・実装し、空いた認知エネルギーを未知の部分問題にフォーカスさせる。これをできるようになることの繰り返し
- 練習・コンテストの経験を入力にして 🧠 を最適化するイメージ
- 強くなるためにおすすめの本
- 問題集 → 茶色や緑色になるためには、けんちょんさんの鹿本の問題を3週ぐらいするといいと思う。鉄則本や典型90問はそのあとで良い
- あと、けんちょんさんと秋葉さんの共同執筆のアルゴリズム本。アルゴリズムを抽象的に眺めてみるヒントが詰まってる
- 数学が苦手な人には遠山啓の「数学入門」上下巻。そのあと「現代数学入門」(途中まででいいと思う) / 数学もメンタルモデルがだいじ
- 心の持ちよう、大事にしてきた哲学
- とにかく継続すること ··· 「10年やり続けたら才能なんて関係ない」(https://terakoya-juku.com/blog/detail/20241125/)
- コンテストに Rated で出ること ··· 緊張するし、怖い。でもエピソード記憶を獲得するためにはコンテストに出るのが一番で、これが成長の近道
- 努力しているのにスコアが伸びていかない → スランプは次の飛躍のための準備期間である (根性論ではなく、認知科学の視点)。楽観的に捉えること
- 緊張を抑えるには
- 細かなテクニックは色々あるが、大局的にはメンタルを健やかに保てるかどうか
- メンタルコントロールには、自分の場合、運動がいちばん効くようだ (あと睡眠)
- 競プロは机の上での活動だけど、運動も無関係ではなかった
- 別にコンテストで爆死したからと言って、まったく死ぬわけではない。誰にでも、よくあること
![[スクリーンショット 2025-03-04 20.23.24.png]]
入水まで 2030 AC くらいでした。結構、量は解いたほうだと思います。
1800 AC ぐらいでだいたい水色になれると以前に chokudai さんから伺っていました。