競プロ始めました

競技プログラミング初心者向けのブログです

40代で競プロができるのかという話

0.はじめに

こんにちは。競技プログラミング歴一年半のかえでです。

私はAtCoder Problems でLongest Streak にチャレンジしています。Longest Streakは、これまで解いたことのない問題から一日一問以上解いた連続日数を競うものです。今日、この記録が500日に到達しました。私は解説ACもするので、純粋に自分の力で解いた問題ばかりではありません。それでも、こつこつと続けてきた自分を、ほめてもよいのではないかという気持ちになりました。

ここまで長く続けられたのは、AtCoder Problemsを作られたkenkooooさんと、AtCoderで解説放送を続けてくださっているsnukeさんを抜きには語ることができません。この場を借りてあらためてお礼を申し上げます。本当にありがとうございます。そしてAtCoder社長のchokudaiさんの経営理念を尊敬し、応援しています。

また、競技プログラミングコミュニティは温かく、その居心地の良さに、すっかり長居をさせてもらっています。参加者のレベルは驚くほど高いのですが、初心者にもやさしいAtCoderだと思います。

せっかくなので何か書こうと思ったのですが、どんな内容を書くべきか悩みました。そんなとき、ふと、以前書いていた記事の下書きを思い出しました。今から半年ほど前に書いていた文章です。今回、それに手直しを加えて、記事を公開することにしました。

こんな人間も競プロに参加しているのだと知ってもらえればいいなと思います。

f:id:kaede_2020:20210707133654p:plain

AtCoder ProblemsのUserページ
1.簡単な自己紹介

私はエンジニアではありません。卒業した学部は文系学部ですし、その後はOA事務を中心に仕事をしていました。その後、妊娠とともに仕事を離れました。(注:妊娠がわかると同時に「つわり」がひどく、仕事どころではありませんでした。)しばらくして、在宅とパートタイムで仕事を始めたものの、コロナで仕事がなくなってしまいました。昨年暮れに派遣で新たな仕事を見つけ、今は、フルタイムの仕事と子育てを両立しながらがんばっています。去年46歳のときに競技プログラミングを始め、今の年齢は47歳になります。*1

2.年をとるにつれて衰える能力

ツイッターで、エンジニアは30歳で高齢者という書き込みをときどき見ました。正直、その年齢に驚きました。実際、競技プログラミングをしている層も、中高生から大学生、20代が多くを占めているようです。

「年を取ると衰える」

当たり前のことなのですが、年を取るとどのようなことが自分に降りかかってくるのかというのは、若いときにはなかなか想像がつかないものです。私は競プロでトップを争うようなレベルではありませんし、エンジニアでもありません。だからあまり参考にはならないかもしれません。それでも年をとることにおびえる必要はないのではないかと思っています。

昔の自分と少しだけ比較してみましょう。子供の頃の自分をひとことで言うと、「努力しないのにテストの点が良い」タイプでした。記憶力がとてもよかったのです。高校のときに進路を文系に決めましたが、数学も好きだったので、理系の人たちといっしょに数学を勉強していました。微分積分も勉強しましたし、行列もベクトルも勉強しました。大学も、受験科目に数学があるところを選んで受けていました。

さて、この歳になって、高校の数学の参考書を開いてみました。

「・・・」。全く覚えていませんでした。「あ-、あれね」とかいう気持ちには全くならず、公式を見ても、何かを思い出す気配は全くありません。唯一私が高校数学を勉強したことがあるのかもと思わせたのは、ギリシャ文字が読めたり、書き順がわかったりしたことです。θ(シータ)と読めたり、θと書こうとすると手が動きます。ふだんの生活でギリシャ文字を使うことはないので、きっと昔書いたことがあるのでしょう。記憶喪失ってこんな感じなのかな、と思いました。このような、かすかなつながりから、かろうじて自分は勉強したことがあるのかもと、昔の自分の姿に思いを馳せるばかりでした。

3.低下した記憶力で競プロに取り組む

競技プログラミングを始める際、数学をすっかり忘れてしまった自分に、いったい何ができるのだろうかという思いはありました。記憶の抜け落ち方はおそろしく、自転車で買い物に行って徒歩で帰ってきたこともあります。

実際に競技プログラミングを始めて思ったことは、学んだことを忘れてしまうことと、解いた問題のことを忘れてしまうということでした。

競プロを始めた頃は、「自分には向いていない」、「学生と解く速さを競うなんて無理に決まっている」と、コンテストでうまくいかない度に思いました。それでも競プロを続けていたのは、子どもがプログラミングをやりたいと言ったときに自分が教えてあげたいと思ったからでした。そして、向いてないと思いながらも、がんばっていました。努力しているのだから、そのうち灰色から茶色(上のレベル)に上がれるだろうと思っていました。しかし、上がれません。ABCコンテストに15回参加したとき、自分のレートは237でした。*2

難しすぎる。そんな気持ちを思わずつぶやいいたツイートに、たくさんのいいねをもらって驚きました。ツイッターを始めたばかりだったので、何か変なことを言ったかなとドキドキきしながら、ハートマークが増えていくのを見つめていました。

f:id:kaede_2020:20210706054412p:plain

自分に競プロは無理と思っていた頃のツイート
4.AtCoderのレベル感

何も知らずにコンテストに参加し始めてしまった私は知りませんでした。そう、コンテストに参加している人たちのレベルが、ものすごく高かったのです。世界に通用するレベルの人たちと、トップを目指す人たちが、精進をし続けている世界でした。私のがんばりなんて、がんばりには入らなそう。そう思うようになりました。また、トップだけでなく、コンテストに参加している人たちの多くが、いわゆる高学歴の人たちだったのです。ツイッターを始めなければ、決して気がつかないことでした。

コンテストの母集団に気がつくことで、少し気持ちが楽になりました。逆にトップの人たちと同じ土俵で戦わせてもらえるのがありがたいと思うようになりました。「参加している自分自身がすごい」みたいな感じです。

5.競プロ上達への道のり

さて、記憶力が低下していると自覚している私にとってプラスだと思えたのは、コンテスト中に何かを参照したり、インターネットで検索をしても良い、ということでした。丸暗記をする必要はなく、解き方さえわかれば、わからない部分は調べながら書いても良いからです。

私は、少しでも覚えていられるようにと、ノートを作り始めました。最初は、AtCoderC++入門の要点をノートに書いていきました。その後、解けなかった問題の板書もこのノートに書くようになりました。学生のうちは努力をしない(もしくは努力のしかたを知らない)自分でしたが、社会人になって仕事を覚えるために、努力のしかたを少しずつ身につけていったのが役に立ったのかもしれません。

AtCoderではコンテスト後に解説放送を行っています。コンテスト後は、解説放送を欠かさずに見るようになりました。全部見るわけではなく、解けた問題の次の問題までです。解けた問題の次のにある解けなかった問題を解いていけば*3、いつか全部解けるようになるはずだと考えました。言いかえると、何もしなければ、解ける問題は解ける、解けない問題は解けないままで、その境界が変化することはないのではないかと思っています。

解説放送では、考察のポイント、アルゴリズムの解説、実際に提出できる形のソースコードまで、詳しく教わることができます。解説放送を見ることで、解説を読んでから自分で実装を書いたときによくやっていた失敗、intとlong longを間違えてなぜACできないのかと思い悩むような時間がなくなりました。(注:このような間違いは、慣れていくと減っていくのですが、最初の頃はよくやっていました。そして、今でもたまにします。)ちなみに、過去の解説放送はYouTubeでいつでも見ることができます。

このノートに、最初は問題の要点や考察の過程、ソースコードを書いていましたが、見返したときには、すでに問題を忘れているので、役に立たないということがわかりました。そこで、問題文もコピーして貼るようにしました。また、ソースコードを書き写すだけだと、何をしているのかわからなくなるので、コメントもつけるようにしました。さらにインデックスをつけることで、コンテスト中にノートを検索しやすくしました。日々手をかけていったノートのおかげで、何とか自分の記憶を補いながら、コンテストに参加しています。今、ノートは6冊目に入りました。ちなみにコンテスト中にヒントや実装を探すためにノートを見ますが、lower_boundなら何冊目のあの場所といったように、どこに何が書いてあるかはだいたい頭に入っています。

f:id:kaede_2020:20210703194703j:plain

AtCoderを始めてから書き続けてきた愛着のあるノートたち
6.競プロとの向き合い方

コンテストに参加してみると、昔と比べて、頭のきれは随分と悪くなった気がしますが、逆に、もとからこんなものだったのかもしれないとも思います。

頭が良いときには能力が衰えていくことを恐れますが、本当に衰えたときには、昔の自分のことも忘れてしまうので、意外に不幸を感じずに済むのかもしれません。

昔の自分だったら、もっとできたかもしれない。それはそうだと思います。でも、勉強が嫌いで、努力も嫌いだった自分が、競技プログラミングの知識を増やそうと、こつこつと真面目に取り組んでいること自体ががおもしろいなと思ったりもします。(ちなみに大学1年生のときに文系もプログラミング必修だと言われて授業をとっていましたが、全く興味がなかったことを覚えています。)*4

記憶力は低下しているのですが、それでも覚えていることができないわけではないとわかりました。毎日問題に取り組むことで、少しずつ知識が定着することを感じるようになっていきました。

最初は無理だと思っていた競プロですが、私自身、解けそうで解けない問題を考えている時間がとても好きなので、今では競プロはとても良い趣味になりそうだと思っています。

私のような生き方をしていくと、この年齢で勉強に関する試験は受けませんし*5、それによって周りから評価されるということもありません。

私の場合、身近にある評価の尺度は、子供が優秀かとか、家事が得意かとか、外見が美しいかとか、自分にとって興味がないことばかりでした。特に一番やっかいだと思ったのは、子供が優秀かという尺度で、自分の出来不出来を測られるということでした。「それって、母親のおかげですか?」心の中で何度も思いました。子供が秀でているのは、子供ががんばったからだと思っています。(子供自身が「今の自分があるのはお母さんのおかげだ」と言うのと、お母さんが「自分の子供が優秀なのは自分ががんばったからだ」と言うのは、全然別の話だと思っています。)

また、「子供には勉強をしっかりしてもらいたい」とか、「子供には英語ができるようになってほしい」とかいう話を聞くたびに、「自分がやったらいいんじゃないかな?」と思っていました(心の中の言葉です)。

自分でやったらどうなるのか、それは私も知らないことでした。

7.競プロの依存性

だから、自分の力で勝負する競プロに、すごくどきどきしました。いったい今の自分はどのくらいの能力を持っているのだろうか、と。

コンテストが始まる前のドキドキ感は、模試を受ける前の気分に似ていて、とても懐かしく思いました。久しぶりに、解けなくて悔しかったり、解けてうれしかったりする気持ちを味わいました。そういった感情の起伏は、年齢を重ねるごとに失っていくように思います。失ってしまった何かを取り戻せるような気がして、コンテストに参加することにとても魅力を感じました。

私は競馬やカジノ、麻雀やゲーセンといったギャンブル要素が強い遊びも好きなので、競プロに同じ感覚を抱きました。依存してしまう人がいるのもわかります。私も自分のレートが上がったときのうれしさは、格別でした。しかし、自分以上に上がっている人を見て、自分が上がったうれしさが消えてしまったことがあります。

ああ、これは危険だなと思いました。

レートが下がったときに気持ちが落ち込むのはしょうがないとして、上がったときにも喜べなくなったら、全ての楽しさが失われる危険をはらんでいます。

自分がコンテストにのめりこみすぎていると感じました。そんなときに自分の気持ちをコントロールしてしまうのが、大人になって自分が変わってしまったところかもしれません。気持ちを一歩引くように調整してしまいました。そのときから、コンテストにそこまで一喜一憂することはなくなりましたが、その分、得られていたはずの喜びも悲しみも減ってしまったのかもしれません。

8.競プロのコミュニティ

コンテストに出始めて三か月ほどすると、レートを上げるために、もっと情報がほしいと思うようになりました、そして、競プロをしている人のブログを読んで、以前から気になっていた、上達法のひとつとしておすすめされているツイッターを始めることにしました。ママ友に聞いても、職場の人に聞いても、ツイッターをしている人はいませんでした。(その当時はわかりませんでしたが、今思うと、もしやっていても、言わない人が多いかもしれませんね。)

どきどきしながら始めたツイッターですが、AtCoderのコンテスト開催情報を早く受け取れたり、有志が主催するyukicoder(ゆきこーだー)といったコンテストや、Codeforces(こーどふぉーしず)といった海外のコンテストがあることを知ることができたり、バーチャルコンテスト(過去問を時間を決めて解く)に一緒に参加したりと、自分の世界を広げることができました。こういったものを自分は求めていたのだと感じました。そして現在ではE869120さんが旋風を巻き起こしています。他の方と同様に、上達したいならツイッターをしたほうが良いとおすすめしたいと思います。

ツイッターの良さは、情報量の豊富さ以外にもあります。多くの人が一生懸命競プロに取り組んでいることがわかるからです。がんばったことを素直にほめ合う姿を見て、すごいコミュニティだと思いました。情報を共有するだけでなく、同志として、競プロを続ける上での励みになっています。

7.これから

今後に関してですが、自分の中では、今後もレートが上がっていくという可能性の低い想像と、ずっと停滞するという現実味のある想像をして、どちらも悪くないなと思っています。なので、当分は続けていくと思います。*6

f:id:kaede_2020:20210706070530p:plain

AtCoderのレーティンググラフ
8.終わりに

私は去年、初心者の状態から競プロを始めました。その頃の自分と今の自分を比べれば、自分が成長していることは明らかです。思っていた以上に新しい知識を吸収できているし、思っていた以上に解くスピードも速くなりました。まだ自分はやれるのではないか。そう思わせてくれました。

昨年暮れに仕事を探そうと思ったとき、フルタイムで昔と同じような仕事に復帰することには不安がありました。新しい会社で仕事を一から覚えられるのだろうか、と。結果は、できました。そして、思った以上に評価してもらえています。

毎年一歳ずつ年齢は増えていきます。そして、衰えは確実に進みます。

これから自分のレートはそこまで上がることはないかもしれませんが、年齢に関係なく競プロを楽しむことができることを、コンテストに参加し続けることによってこの先も伝えていけたらいいなと思っています。

f:id:kaede_2020:20210707073701p:plain

いちばん最初に出たコンテストはABC150でした(unratedになりました)

f:id:kaede_2020:20210706070717p:plain

参加者のRating分布
9.<番外編>もし後悔があるとすれば

競プロとは話がちょっとずれます。

子どもの頃からずっと勉強が嫌いだと思っていました。本当は新しいことを学んだり、考えたり、試したりすることが好きで、学問に向いているのかも、と思ったときには30歳を過ぎていました。これまでの人生の中で、好きになれるものはそう多くはありませんでした。結局、まわりまわって、もとの場所に戻ってきてしまうのです。つらいなら無理しないでという風潮がありますが、好きなのだったら、あきらめずに続けてほしいと私は思います。できることなら、私のように能力を全て失ってから戻ってくるのではなく、失わないように、少しでも続ける道を選んでもらいたいなと思います。少しでも続けていれば忘れることはありません。目標を変えて、続けていってほしいと思うのです。続けることに価値がある、私はそう思っています。

*1:子供の年齢は非公表です。私は子供のことを話さないようにしていますが、子が「かえでは自分の母です」と言ったとしても、それは問題ありません。そのときはうちの子をよろしくお願いします。

*2:400以上になると茶色のレベルに上がります。

*3:自分がABまで解けたらC問題の解説放送を見るということ

*4:プログラミングの宿題が出て、サークルの理系の同期に「かわりにやってほしい」とお願いしたら、「本当にそれでいいの?」と真顔で聞かれたことを今でも覚えています。

*5:この文章を書いていたときには、試験を受ける自分なんて想像できませんでした。しかし6月にITパスポート試験を受け、無事に合格することができました。チャレンジしようという気持ちになれたのも競プロのおかげだと思います。

*6:実はこの文章を書いていたときにはレートが停滞していたのですが、5月末にAtCoderのレートが茶色から緑に上がりました。この先また同じように停滞する期間が続くと思うのですが、それでもやはり、競プロに対する気持ちは変わらないだろうと思っています。