すこしだけ欠けたピアノの音色

競技プログラミング、始めました。

「知性」を身に着ける人へ、伝わってくれたら嬉しいこと

これは、競プロ界隈を賑わせたとある記事への、

僕なりのアンチテーゼです。

競プロの意義とか、儒教文化の善悪、などについては触れません。

ただ「知性」というもののあり方について、

どうしても主張しておきたいことがあって、この記事を書いています。

 

当然ながら、僕の主張が100%正しいなんてことはありません。

むしろ間違いだらけの、ただの一個人の信念です。

 

 

ですがこれを読んで、少しでも何かを感じてくれる人がいるのであれば、

それは何より嬉しいことだと思います。

 

 

僕があの記事を拝読して、ここまで熱くなってしまうのは、

それが僕の価値観と真っ向から対立するものだからです。

それは競プロに対してではなく、

「知性」とか「賢さ」と呼ばれるものに対してです。

 

 

知性とは決して、

「賢い」人間とそうでない人間を分断する道具ではなく、

あるいは難解な言葉で欺瞞を覆い隠すベールとして用いるものでもありません。

いえ、そんなものであってほしくはないのです。

 

知性とは、異なる背景を持つ他者との、

対話を可能にする素晴らしい道具です。

 

あの文章にあてられて、

「圧倒的知性のまえに自分は無力だ」と思ってしまった人がいるとしたら、

僕はその絶望を、希望へと塗り替えたい。

本当の知性というのは、人を萎縮させるものではありません。

あなたが未知の世界へと踏み込む、その手助けをしてくれるものです。

 

 

僕は田舎の、「進学校」というにはあまりに心もとない高校から

一応は「高学歴」に分類されるであろう大学へと進学しました。

高校では、「勉強ができる」という意味で僕以上の人には出会いませんでした。

けれど、人として本当に「尊敬できる」友人にはたくさん出会いました。

高校時代の3年間は本当に貴重な経験でしたし、

彼らがいなければ、僕は今ここにはいません。

 

「勉強ができる」ことが偉いことでもなければ、

「世界的な企業に入れる」ことが偉いわけでもありません。

それはどちらも、素晴らしいことではありますが、

「それが出来ない人を否定する」ものでは、断じてあるわけがないでしょう。

 

人にはそれぞれ、得意なこと、苦手なことがあります。

当たり前ですが、そのうちの一つを取り上げて、

「人間の価値」を定めることなど、してはいけないと思うのです。

 

 

なぜ、競プロアカウントでこんなことを書くのか。

それは、99%の自己満足を抜きにすれば、この界隈に

「高学歴」あるいは、そうなるであろう学生さんが多いからです。

 

あなた方は、人よりも「賢い」ですし、

より高度な「知性」を身に着けた素晴らしい存在になっていきます。

その素晴らしい能力を、

「自分の思想を人に押し付けること」や

「他者を欺くこと、あるいは見下すこと」には、

どうか使わないでいてくれませんか。

 

賢さがあれば、「一見理解しがたいもの」を

かみ砕いていくことができます。

それは自然界の法則であるかもしれませんし、

誰かの深遠な言葉であるのかもしれません。

 

知性とは、対話です。

対話を通して起こるのは、価値観の相対化です。

今まで常識だと思っていたもの、

それは学問の世界でそれまで正しいと信じられていた理論であったり、

自分自身の中にある価値観だったりしますが、

それは永遠の真実では、おそらくありません。

それと異なる実験事実や、言説などに出会ったとき、

それらを冷静に見つめて紐解き、

それまでの「常識」を

むやみに信じ続けるのでも、全否定してしまうのでもなく

アップデートすることによって、我々の知見は広がり続けるのです。

 

その先に見える世界は、きっと面白い。

あなた方の身に着ける能力が、

この先あなた方の助けとなり、

そして他者へも勇気を与えるものであることを祈ります。

Hello World! AtCoder水色になりました

 

■プロローグ Hello World!

 

はじめまして。riano_ です。

初めてのブログ投稿、"Hello World"を出力したあの日を思い出しますね。

そんな僕も、競技プログラミングを初めてもうすぐ3か月になります。

少し前になりますが、目標の「水色」になれたので記念に色変記事を書いてみます。

自己紹介とポエムが大半ですが、ほんのわずかでも、参考になれば幸いです。

 

 

■前編 自己紹介、ほんのすこし競プロのススメ

 

早速ですが、自己紹介です。

僕は大学院を出てもうすぐ3年目になる社会人競プロerです。

大学院では理論物理の研究をしていたので、数学的な素養はかなりあると思いますが、

驚くべきことに、ほとんど「紙とペン」で研究をしていたものですから、

プログラミング歴は正真正銘3か月です。

ちなみに今は、物理ともITとも全く関係のない営業をやっています。

 

さて、大学院卒業後に2年間「理系」であることを忘れていた僕ですが、

やはり理系としての衝動は抑えられるものではありませんでした。

学生時代の教科書やノートを見ていると、

難解な理論を必死にかみ砕いていたあの頃の刺激が、ふと蘇ってきたのです。

 

とはいえ、ただ復習するだけでは少し面白みに欠けるということで、

せっかくなら新しい要素を交えて何かチャレンジできないかと考え、

たどり着いたのが競技プログラミングの世界でした。

 

競プロを楽しんでいる方々のバックボーンは本当に様々ですが、

「理系」の記憶を眠らせている社会人の方などは、

きっと熱中できると思いますのでぜひ始めて見てください。

 

 

■後編 2か月で入水する精進心得

 

さて、本題です。

僕が初めてコンテストの出たのは、2020/12/13のABC185でした。

それからちょうど2か月、2021/02/13のARC112で念願の入水を果たしました。

 

f:id:seashellpink-frostywhite:20210228212456p:plain

rating推移

 

この世界、天才と化け物は無限に観測できますので、

もっとすごい人が山ほどいるのは承知ですが、それなりに誇れる成績だと思います。

一方で、既に述べた通り、僕はプログラミング初心者でしたので、

最初から強かったわけではありません。

事実、年越し時点では茶perfが自己ベストでした。

 

f:id:seashellpink-frostywhite:20210228212611p:plain

performance推移

 

(今でも強くないじゃん、という方は半年待っててください。追いついて見せます。)

そして、社会人競プロerの宿命として、精進にかけられる時間は限られています。

 

ではどうやって「効率的に」強くなったのか、何を考えて精進したのか、

少し書いてみたいと思います。

具体的な精進方法については、優良記事がたくさんありますので、

ちょっと抽象的なお話をさせてもらいましょうか。

 

 

Point1 「perfを上げるためのボトルネックは何か考える」

競プロにおいては、様々な能力によって成績が左右されます。

例えば、基本的な知識を知っていること、難解に見える問題の本質を看破すること、

意図した操作を速く正確に実装すること、など、挙げればきりがありません。

その中で、自分の強みと弱みがどこにあるのか、

そして何を解消すればperfが上がるのか、

仮説が立てられていると、効果的に精進が出来ます。

 

例えば僕の場合、初回~3回目のABCは全て4完の成績ですが、

初回では、実行時間制限が分からず、TLEを繰り返すなどして

「なんとか4完にたどり着く」状態でした。

しかし、ある程度「競プロの流儀」に慣れた3回目では、

「4完にはある程度余裕をもってたどり着き、しかし5問目には手も足も出ない」

状態になっています。

つまり、ボトルネックが「A-D問題がすんなり解けない」ことから

「E問題相当の難易度に手が出ない」に変化している、というわけです。

そうと分かれば、どんな精進をするべきかは明確ですね。

 

これは非常に分かりやすい例ですが、

上のような判断が出来れば、おのずと「何を克服するべきか」

あるいは時に「何を伸ばすべきか」、分かってくるのではないでしょうか。

 

また、とても感覚的な言い方になってしまうのですが、

僕は今までの精進で「強みを伸ばす」時期と

「弱点を克服する」時期が交互に来ていたように思います。

 

これはおそらく、

「あるdiffの問題を概ね解けるようになる」には弱点の克服が、

「今まで解けなかったdiffの問題を解く」には強みを一段伸ばすことが、

最適解であるからだと思います。

そしておそらく、

「そもそも解けない」→「解けるはずだけど時間が足りない」

というボトルネックは、

D問題→E問題→F問題と、あるいは緑diff→水diff→青diffと、

前進しながら交互にやってくるはずですから、

その時々に応じた精進をすればよいはずです。

 

以上のようなことを、

コンテスト、あるいはバチャを走るたびに分析し、

ボトルネックの解消」を目指すのが僕の精進スタイルです。

 

 

Point2 「精進方法は柔軟に変える」

これはもはや人生における教訓だと思うのですが、

「手段を目的にしてしまう」とたいていのことはうまくいきません。

何かを決めるのはいいことですが、それに縛られて目的を見失ってはいけないのです。

 

例えば、「解説ACはしない(自力で考える)」という方針を取ったとしましょう。

(初期の僕はそうでした)

しかし、それでは絶対に解けない問題にぶつかることになります。

Segment treeを知らずに、自力で解くことができるでしょうか?

できた人は天才なのでこの記事を読む必要がありません。

むしろ記事を書いていろいろ教えてくれると嬉しいですね。

 

話がそれました。

結局僕は、あるタイミングで何問か「どうしても解けない問題」にぶつかって

「ある程度詰まったら積極的に解説ACする精進」に切り替えたのですが、

それは「精進の効率の最大化」という目的を考えたとき、

その時点で「長所である考察力を鍛える」よりも

「足りていない知識を身に着ける」方が優位になったと判断したからです。

(他にもこれまで様々な方針転換をしているのですが、長くなるので割愛します。

 下のtweetもその一例です。)

 

 

 

 

1つ目のポイントとも繋がりますが、

精進すれば実力は変化し、能力の「バランス」も変動するのですから、

その時々で最適な精進が変わるのはある意味当たり前です。

「一度やると決めたこと」が非効率的に思えるようになったのなら、

それは、その方法で有意に成長した証なのですから、

喜んで決意を投げ捨て、新たな決意を打ち立てましょう。

 

 

■エピローグ すべての競プロerにエールと感謝を

 

少し偉そうに語ってしまいました。

もちろん、ここまで来られたのはtwitterで出会ったライバル達や、

有益な情報を教えてくれたりする先輩競プロerの方々のおかげです。

「どこが間違ってるんだろう」とtweetしたらコードを読んで考えてくれる方、

もはや聖人なんじゃないでしょうか。

 

競プロは外部から見れば、きわめて無機質な趣味に見えるのかもしれません。

しかしながら、そこで紡がれるのはrate変動に一喜一憂し、

時に競い合い、高めあい、そして何よりそれを楽しんでいる人々の、

とても生き生きとしたドラマなのです。

 

社会人になって、こんなにも夢中になれる趣味を見つけられたのは、

僕にとってとても幸せな出来事でした。

rate変動はゼロサムゲームですが

AtCoderではたぶん違うんですが、ここは雰囲気で言わせてください)、

「競プロ」はそうではありませんから、

ぜひこれからも、熱くて温かい競プロ界の一員でありたいと思います。

 

2021.02.28 感謝をこめて。by riano

 

 

■追伸 決意表明

 

ここまでお読みいただきありがとうございます。

さて、次は青を目指して精進しているところですが、

青になったときには、色変記事を書かないつもりでいます。

黄色でも、書きません。

 

いつか橙になる、それを目標にやっていきたいと思いますので、

橙になるその日まで、次の色変記事はお預けにします。

 

色変以外の記事は、思いついたら書いていこうと思います。

思うがままのモノローグですが、お付き合いいただけると嬉しく思います。