【初投稿】自己紹介です。

初めまして、Lorentと申します。
今日から、主に競技プログラミングに関するブログを始めようと思いますので、
まずは自分を知ってもらうことから、と思い、この記事を執筆いたしました。
ブログを書くこと自体初めてなので、稚拙な文章ですが、最後まで読んでいただけると嬉しいです。

自己紹介

私は22歳の大学5年で、医学を専攻しています。

趣味は料理・お菓子作り楽器演奏ルービックキューブです。
あとはなんといっても競技プログラミングです。

料理・お菓子作りは、「産物が美味しく食べられる化学実験のようなもの」という感覚で楽しんでいます。
火加減、分量等、忠実にレシピに従って作るので、私の料理が美味しくなかったときは全てレシピの責任です。 (はい!?)

楽器演奏についてですが、ピアノ🎹を弾いたりサックス🎷を吹いたりします。
ピアノは小2から中3まで習っていて、サックスは中高と吹奏楽部で吹いていました。
どちらも決してうまくはありませんが、気の向くままに演奏して楽しめればいいのです。
趣味でやる音楽とはそういうものです。

ルービックキューブは小4の頃からハマったり冷めたりを1000000007回ほど繰り返しています。(ちなみに現在、冷め期です。)
20秒台ほどで揃えられますが、これは界隈の人からしたらとても遅いです。
世界記録を知っていますか?私は知っています。3.47秒です。
目隠しでも揃えられます。ただ、これもとても遅く、暗記スタートから揃え終わるまで5分ほどかかります。目隠しの世界記録は18.32秒とのことです。頭おかしいですね。

さて、ここまで長くなってしまいましたが、競プロ系ブログですので、ここからは私とプログラミングについて書きたいと思います。

プログラミングとの出会いから今まで

高校時代

初めてプログラミングという世界と触れ合ったのは、高校生の頃です。

高校生の頃、学校と部活以外の時間はほとんど地元の図書館で勉強していたのですが(『青春』?私の知らない単語ですね。)、毎日通っていると、座席のポジションが大体定まってくるのです。そこで私のポジションに最も近い本棚に並んでいたのが、プログラミング関連の本でした。
勉強で疲れた時に、ふと目についた『やさしいJava』(今思うと、『やさし』くはなかった)を手にとって読んでみると、そこには私の知らない世界が広がっていました。大変興味深く、わくわくした覚えがあります。
しかし、私はそこで思いました。「ここでプログラミングをし始めたらのめり込んでしまい、勉強が疎かになってしまうのではないか……」と。医者になるために必死に受験勉強をしていたので、その時点でプログラミングをし始めることを諦めました。今思えば、私にとってこれは英断でした。

大学生になって

無事大学に合格してからは、音楽系のサークルに入って夜遅くまで活動したり、毎週レポートに追われたり、家庭教師のバイトを始めたり、自動車学校に通ったりと、まあまあ忙しい毎日を送っていたため、高校生の頃抱いたプログラミングへの興味は忘れかけていました。

転機は大学2年の春休みでした。

大学生の長期休みって、本当に長いんですね。1月下旬〜2月上旬に試験や最終レポートの提出を終えると、課題も何もない状態で4月の2週目あたりまで完全にフリーです。私の場合、サークル活動と家庭教師バイトが定期的にあったものの、それ以外は大変暇で怠惰な生活を送っておりました。

私は無駄な時間を過ごすことほど嫌いなものはありません。忙しいときは忙しいときでしんどく思うときもあるのですが、忙しいこと(やりたいことがあること)ほど幸せなことはないとつくづく思います。 理不尽な忙しさに関してはあまり経験したことがないのでなんとも言えませんが…。

なので、怠惰な春休み生活に耐えられず、「何か始めなければ……堕落してしまう……!」というある種の強迫観念に駆られ、何かやりたいことはなかったか、と考えました。
そこでふと思い出したのが、高校生の頃に抱いたプログラミングへの興味です。 大学生になってから、my new gear…(MacBook)も手に入れたことですし、これはもうやり始めるしかありません。

初めて実際に書いてみたプログラミング言語は、Swiftです。

SwiftはApple社が2014年に作った言語であり、iOSmacOS上で動くアプリの開発などに特に優れた言語です。ちょうどMacBookを使っていることもあり、簡単なアプリの開発を目標にSwiftを勉強してみようと思いました。
(はい、プログラミング言語を始めるなら『Swift』」 「『Swift』を学ぶべき3つの理由」 「今、『Swift』が熱い!」みたいな記事に踊らされていました。)

ただ、勉強して文法的なところは理解できたものの、実際のアプリ開発となると、プログラミングの本質的な面白さというよりはGUIの細かな調整などが多く、これは私の勉強したかったことじゃないな…と感じてしまいました。

そこで次に出会った言語はRubyです。

Swiftに飽きてしまったので、例の地元の図書館に行き懐かしのポジションあたりで改めてプログラミング本を漁っていた際に、気になる本を見つけました。それが『Rubyで数独(AIプログラミング入門)』 という本です。著者の佐藤理史先生が、私の所属する大学の工学部にある、自然言語処理を専門とする研究室の教授であったことから興味が湧きました。

競プロを嗜まれる皆さんでしたら、「数独なんて再帰で余裕www」と思われるかもしれません。しかしこの本のすごいところは、「数独はもちろん再帰で一瞬で解けてしまうのだが、できる限り人間が数独を解くときの思考をプログラムに落としてみよう」というスタンスで書かれているところです。最終的には、どういった根拠の元に、どういった順序で空きマスが埋まっていくのか、まで出力してくれる数独ソルバーが完成します。これは再帰で解いたら決してできないことですね。

Rubyの文法を前提知識として求められる本ではあったのですが、その本を読み切りたい一心で、Rubyの入門本と一緒に、プログラムを理解しつつ写経しながら読み進めました。この本のおかげでアルゴリズムの面白さに目覚めたといっても過言ではありません。名著です。自信を持ってお勧めできます。

競プロとの出会い、そして別れ

そこから競技プログラミングに出会うまでに、時間はかかりませんでした。アルゴリズムを楽しく学べるサイトとしてAtCoderが紹介されていたのをブログ記事か何かで読んだのだと思います。
ここでめでたい私の初ACのリンクを貼っておきます。

atcoder.jp

この時期は今よりも確実にRatingが上がりやすく、アルゴリズムの知識は何もありませんでしたが、adhocに問題を解くだけでグングン伸びてあっという間に緑色になれました。
このグラフの2018年3月〜5月あたりの話です。

f:id:Rorent:20200504155947p:plain

(この時期からコツコツと続けていたら今は何色になれているのだろうか…。)

また、どうやら競プロerはC++で書くことが多く、私の書いていたRubyで競プロについて解説されている記事は大変少なかったので、勉強はしにくく感じました。 そこで、次点で人気のあったPythonに目をつけました。Rubyと文法が似ている部分も多く、スッと身に付けることができました。

ただ、そんなこんなしているうちに大学が再開します。忙しい毎日が戻ってきてしまいました。上述の通り、それはそれで幸せなことなのですが、競プロからは2年ほど離れていました。
その間もプログラミングは細々と続けており、興味から『Pythonではじめる機械学習』『ゼロから作るDeep Learning』『作って動かすALife』などを写経しながら読み進めたりしていました。
また、私の学部に医療系データを解析する研究室があり、大学3年の後期に半年間ほど通い勉強させていただいたりもしました。(このとき、Rの勉強もしました。)

競プロとの復縁

最近になり改めて競技プログラミングに興味を持つきっかけとなったのは、サークルの後輩である情報学部の子も、競技プログラミングをやっているということを知ったことです。
新型コロナウイルス感染拡大の影響により、人と会うことも憚られ、臨床実習も行えない今、自宅で何をして過ごそうかと考えている真っ最中であったので、2020年3月、とりあえず競プロを再開してみることにしました。

以前からPythonC++より遅くて不利だ」と言われていることは知っていましたし、できればC++で書きたい思いはありましたが、言語を変えたその移行期間中に、実力以外の問題でRatingが落ちてしまうことを危惧していました。
しかし、これだけ期間が空いてしまえば、移行期間も何も関係ないではありませんか!
しかも、APG4bという競プロのためのC++入門記事も、AtCoder公式から出されているではありませんか!
というわけで、C++の勉強をしつつ、それと並行して競プロに必要なアルゴリズムの勉強も始めました。

再開してみると、2年前に理解できなかったことも、いつの間にかなんとなく理解できるようになっていることに気付きました。機械学習Deep Learningの勉強をしている際に、疑似コードなどをたくさん読んで考えたりしたので、そのおかげかもしれません。

私の精進の仕方については、色変ブログで書きます。

今や、競プロにハマりにハマっています。朝起きたらまずあさかつ(リアタイで参加はほとんどできていません)、次に復習キューの消化、新しいアルゴリズムの勉強、Twitterで交流のある人がバチャしていたらふらっとお邪魔する、コンテストのない日はよるかつ、コンテストのある日はたとえAtCoderCodeforcesのRatedが同じ日にあろうと必ずどちらも参加、Codeforcesが夜中にある日は生活リズムをCodeforcesに合わせるために昼寝、等々…。
これだけ存分に競プロにのめり込めるのも、今のうちだと思うので、本業である医学の勉強を疎かにしない範囲で、これからも全力で取り組んでいきたいです。

将来について

私は昔から医者になりたいという夢があったので、必死に受験勉強をして医学部に入学しました。
ただ、これは入学してから気づいたことなのですが、医学という学問は、基本的には最終的な目標が「病を治すこと」にあるので、「作用機序はよく分からないが、この薬を使うと治った」とか、「悪い部分を切ってつなげたら治った」というところから進歩していく部分も多いのです。また、疾患一つとってみても、「なぜこの疾患がこのような症状を引き起こすのかは不明」と言われることもかなり多いです。ですので、必然的にただ暗記しなければいけないことも多くなってしまいます。
高校時代は数学物理に特に魅せられていた私には、この学問体系がもしかしたらあまり合っていないのかもしれません。

その点、競プロの勉強においては、アルゴリズムの正当性の証明は必ず為されますし、一度理解してしまえばその理解のもとに実装すればよいので、闇雲に暗記しようとする必要はありません。学んでいてとても気持ちの良い学問です。

本当に学問的な興味で言えば、私はもしかしたら医学部に入るべきではなかったかもしれません。ただし、医者になりたいという思いは今でも変わっていません。

ですので将来的には、医学とITをもっと結び付けたい という思いが漠然とあります。 このような分野でしたら、私の興味をどちらも活かせるのではないかと考えています。

と、まあこんな大層なこと言ってますが、今の時点で具体的なビジョンは何もありません。 今は、プログラミングを学んでおくことで、将来医療現場に出た際に、IT技術が活かせるチャンスを見つける嗅覚が育つのではないかといったモチベーションで勉強しています。

おわりに

競プロ界隈でTwitter上で交流してくださる方、いつもありがとうございます。
精進に関してはもちろん、他にも多種多様な方面で努力されている方が多く、良い刺激を受けています。
今現状、こういった社会状況なので、オンサイト等でお会いできる機会はありませんが、もし今後そのような機会がありましたら、ぜひお会いしてお話してみたいユニークな方たちでいっぱいです。
これからもどうぞよろしくお願いいたします。

この記事を気に入っていただけましたら、ぜひスターもよろしくお願いします!
今後の執筆の励みになりますヽ(´▽`)/