2020年1月3日金曜日

AtCoder黄色になりました、2019年の振り返り~2020年の目標

 年末のAtCoder Grand Contest 041で黄色になりました!


 また、上がり下がりが激しいのですが、Codeforcesでも薄橙に戻って新年を迎えることができました。


 約一年でAtCoder青→黄色というのは、早い方とは言えないかもしれませんが、自分としてはかなり上手くやった方だと思っています。一年前青になったときは、2020年をAtCoder黄色になって迎えられるとは予想していませんでした。早くとも一年半はかかるだろうと覚悟していました。

 AtCoderを始めて、色の感覚がなんとなく分かった頃から、黄色以上は天才という感覚がありましたし、今もあります。そこに一度でも到達できたということは非常に嬉しいです。

黄色になるまでしたこと

基本的には、この一年やってきたことは青以前と変わりません。

・コンテストに大量に出る→読んで解けなかった問題をできるだけ復習
・AtCoderのStreakを繋げる

 くらい。

 コンテストにはたくさん出ました(2019年のCodeforcesのコンテスト参加回数二位だったらしいです。えぇ……、自分でもちょっと引く)が、効率良く勉強できていたかは疑問。特に、Codeforcesでは解きっぱなしの問題が多くて、あまり身になっていないと思う。
 とはいえ、一年前と比べれば、復習する範囲は広がっています。700点くらいの問題なら解説ACはしなきゃ、と思えるようになりました。ただ、本当に手の届かなそうな問題にチャレンジしたりはしていません。

 AtCoderのStreakは、不慮の事故(リジャッジでAC→TLEになったと思っています。全ての提出がACになるバグが起きていた時期と近いので、まとめてリジャッジされたんではないかと。)で切りましたが、それ以外は繋げることができました。
 でもこれは、やる気のない日に競プロから気持ちが完全に離れてしまうことを防ぐためのものという感じですね。

 というわけで、特別な変化はしていません。環境も変えてないです。エディタもまだIDLEを使っているし……。

 なので、一年前に比べてはっきり実力が付いたかというと疑わしい気もするのですが、まあ多少安定感は増した気はします。一年前は、Pythonの書きやすさ等のおかげで青まで来れたけど、実際の実力は色一つ(レート400)分くらい下なのでは? という気がしていましたが、今はそこまでの差は感じません。たとえばC++でも、(今すぐは厳しいですが)多少練習すれば青パフォは取れる気がしています。

なんで早く到達できたか

こうした、あまり工夫のない方法で黄色まではいけそうだと思っていたし、実際到達できましたが、じゃあ、なんで早く到達できたか、というと、

・令和ABCが始まり、「レーティング更新対象: 0 - 1999」のコンテストが増えた

 ことが大きかったことは間違いないです。

 自分はそれほど令和ABCという相性が良かったわけではないですが、同じくらいのレートだった人がどんどん黄色に上がっていくのは刺激になりました。
 そして、そのせいで黄色になる実力のボーダーはやや下がったと思います。感覚的には大体レート100くらいずれた印象があります。以前のレート2000と同等の実力と主張したいなら、2100にはならないといけない気がしています。

 あと、

・10月から「ちはやふる3」のアニメが始まった

 ことが大きいですね。いや本当に。

 こういうスポコン系のアニメを見ると、「自分も努力しなきゃ」という気になります。本当のスポコンもの、スポーツで努力している作品を見ても、ちょっと遠い世界に思えてしまい自分を省みることが難しいけれど、こういう文化的な匂いがする作品は刺激になる。
  競プロ界隈のTwitterで「響け! ユーフォニアム」が話題になっていた時期(劇場版公開の頃です)に、「響け! ユーフォニアム」のおかげでやる気が湧いたというツイートを結構見た気がしますが、自分には「ちはやふる」の方が合っているみたい。(「ユーフォ」は好きだったけど、やる気が出るということはあまりなかった)
 いや、「ちはやふる」では、戦略性の高い個人競技で、元々才能がある人たちがさらに努力している姿を見せていて凄く良いと思う。刺激を受けています。(なお、百人一首は覚えていません)

黄色になる目安

さて、ところで。

 基本的には、AtCoder黄色の目安は、「700点まで全AC」(解説ACでOK。もちろん、解説を理解せずにACしたのではダメですが)くらいだと思っています。これでなれなくても、「800点まで全AC」をすれば9割以上の人は黄色になれるんではないか、と。
(Beatmaniaを知っている人向けに。これはSP難易度表の「地力Aや個人差Aのハード埋め」(よくSP皆伝の目安と言われるが、これを達成して皆伝を取れてない人も意外と多い)、と「A+ハード埋め」と大体対応していると思っています。
 個人的には、こういう風に他のゲームなりの経験を当て嵌めて考えた方が、自分の現在位置を把握する目安になって努力しやすいと思う。だからもっと多くの人に、受験勉強やらゲームやらスポーツやらとの主観的な対応関係を語って欲しい)

 実際は、AtCoderで黄色や橙になっている人のほとんど(もしかすると全員?)が、そこまで埋めずに黄色や橙になっている気がしますが、それは、やっている人が優秀だったり、他で数学やらパズルやらの経験をかなり積んでいたりするからではないか、と。

 実際自分も、700点問題はまだ半分も埋めていない(現状24/63)し、Codeforces等でそれを補う経験を積んできたかというと怪しい(Codeforcesでは、難しい問題は解説ACもできていないことが多い)。
 それでも黄色になれたというのは、他の経験が生きたんだろう、と思っています。ただ、自分の経験が多少なりとも役に立つのはこのあたりまで、という気もしています。

上を目指すにあたって

自分がさらに上へいけるか、というのはかなり疑問に感じています。

 そもそも、自分はどの分野でも(音ゲーもそうですが、音ゲーに限らずどのゲームでも、勉強関連にしても)、せいぜい黄色あたりの実力にしかなったことがない。

 競技プログラミングに関しても、自分のしてきたことは、ここか、もう少し上(高々レート2200あたり)を目指す努力だったと思います。もし、今後もっと上を目指すなら、このままではダメなのではないか、何か方針を定めたり、新しいこと(解説記事を書いたり、作問したりはしてみたい!)をしたりしなくてはいけないのではないか、という気がしています。

 ただ、他方では、別に新しいことをしなくても、「誰でも「800点まで全AC」くらいで黄色になれる」のなら、「誰でも「1000点まで全AC」くらいで橙になれる」のでは? とも思っています。
 しかし、現実には800~1000点あたりの問題は解説(や他の人のコード)を読んでもなかなか理解できないので、容易ではないですね。

競技プログラミングで差が出る部分

唐突ですが、競技プログラミングの実力向上に関して、一番差が出るのは、

・解説を読んで理解する能力の差

 だと思っています。以下、その説明のため、エセ科学みたいな怪しい内容を書きます。

 問題を解くことのみで競技プログラミングの実力を上げる場合、

・問題の練習量

 から、

・忘却量

 を除いたものが実力になると思います。
 なので、同じ問題セットを解くなら、短い時間で解いた方が実力は向上するはずです。忘却量が少ないので。

 ところで、最近、

・一問を解いたときの学習量

 は人によってあまり変わらないんじゃないか? と思うようになりました。「一を聞いて十を知る」というようなことはない。一問から得られる経験値は誰でもあまり変わらず、もし十を知ったように見えた人がいたならそれは、その人に既に他の知識があり、それと結びつけることができたため十を知ったように見えたんじゃないか、と。
 競技プログラミングを始める前はあまり分からなかったんですが、優秀な人の成長の様子等を見ているうちにそう思うようになりました。

 でも、同じくらいの時間と熱意で努力していても人によって結構差が出るように思えますよね。その差の一番の原因が、

・解説を読んで理解する能力の差

 じゃないかと。同じ問題セットを解いた(自力ACもしくは解説ACする)ときの実力向上はそこまで差が出ないけど、理解するまでの時間にはかなり差が出る気がします。

解説を読んで理解する能力

とはいえ、誰でも、(主に数学関係の)勉強する上で一番苦労するのが、この、「解説を読んで理解する」部分だと思うので、人によってどの程度差があるかはよく分からないんですよね。実力によらず、この部分が苦手だと思っている人は多い気がする(そういうツイート等もしばしば見かける)。

 今の自分の場合、AtCoderの公式解説を読んですんなり理解できるのは400点問題くらいまで。500点くらいの自力で解ける問題でも、公式解説をすぐには理解できないことは結構あります。また、700点~くらいの問題は時間をかけても理解できないことが多いです。

 まあでも、公式解説は結構簡潔に書いてあるし、こんなものか、とも思うのですが、ブログなど非公式の解説で(分かった後に読み返せば)ほぼ行間のないような丁寧なものでも、700点~くらの問題だとその場では理解できないことが結構多いし、理解できたとしても、一時間くらいはかかることが多い。これは遅い方なんじゃないかと。

 多分、この原因の一つは、自分が小説を読むように解説を読んでしまう、というところにある気がします。

 数学的な文章でも、まず小説を読むときのような読み方(緩く全体像を捉えよう、というような)をして、それで分からなかったときに、一行一行を論理を追うような読み方をする。で、論理を追っただけでは理解できず(した気になれず?)それを自分のストーリーに当てはめてようやく理解できた気になるんじゃないかな、と。
 だから多分、二度手間になってるんですよね。最初から数学的・論理的な読み方をして、数学的な理解=自分の理解となるなら、もっと早く理解できるんじゃないか、と。昔から悩んでいることなのですが、そもそも、頭の中の知識の整理の仕方が、他人と比べて論理的な配置になっていないような気がしているので……。
 理解が早い人は、数学的内容をそのまま(ではなくても、それに近い形)理解していて、そこら辺で差がついてるんじゃないかなぁ……。

解説を読んで理解しなさい

……と、ここまで書いてちょっと放置していたのですが、その間に、いや、さすがにこれは甘えてるのでは? と思えてきました。

・解説にギャップがあって理解できない
・解説であまりなじみのない概念(データ構造など)を使っているため理解できない

 のは仕方ないと思います。自分は、Union-Findや遅延Segment treeを理解するのに数日~一週間程度かかりました。まあ、そういう(分かってしまえば簡単なものでも)新しい概念を受け入れるのに時間がかかる(もしくは時間をかけても分からない)のは仕方ない。
 また、頭の中のデータ構造(?)に問題があるというのも、(その真偽はともかく)どうしようもない。
 けれど、

・適正問題で、特に未知の概念もなく、ギャップもない解説を理解できない

 というのはさすがにダメでは?

 実際問題として、そういう解説なら、ちゃんと数学書を読むときのように論理を追って読めば、(文体が合わなかったりして、なぜか理解しにくい部分があったとしても)長くとも一時間~二時間程度かければ理解できるのでは?
 そういう問題・解説を結構諦めてしまっていたのは、やる気がなかったからと言われても仕方ない気が。いや実際、論理をしっかり追って読むと疲労するので、途中で寝てそのまま諦めてしまうことも多かったような。

 そして、競技プログラミングでは、ありがたいことにそういう問題や解説を選ぶことができます。(その勉強しやすさこそ、競技プログラミングの一番の良さだと思っています。)
 適正問題かどうかは問題の点数やAC人数から分かるし、(どの問題も、というわけではないですが、1000点くらいまでの問題なら結構高確率で)ギャップの少ない解説を書いてくれている人がいます。

 レート2000前後という自分くらいの段階なら、解説自体が難解なほどの問題(の解説を理解すること)に挑戦する必要はないはず。なので、まずは、理解できるはずの(しなくてはいけない)解説をしっかり理解し、ACすることですね。
 これを繰り返せば700~1000点問題のかなりの部分が埋まるはずだし、それで橙近くまではいけるのでは?

 競技プログラミングに関してこれを今年の目標にします。

0 件のコメント:

コメントを投稿