torus711 のアレ

主に競技プログラミングの問題について書きます.PC 以外だと数式が表示されないかもしれないです

競技プログラミングを始めて人生が変わった話

はじめに

 (少なくともブログ上では)お久しぶりです.この記事は,Competitive Programming (その2) Advent Calendar 2016 - Adventar の 14 日目の記事です.
 いわゆる思い出ポエムが流行って(?)いて,わたしも楽しく読ませてもらっています.人々の昔話を読みながら昔のことを思い返してみたところ,競技プログラミングにハマる以前からは想像できないような未来に生きていることに気付いた(というか再認した)ので,わたしもちょっくら書き残してみようかな,と思いました.丁度枠が残り一つだったのと,「何か」を飲んでいたので,


といった具合で登録しました.
 話としては,「色々あったけど,わたしは現状に割と満足しているので,紆余曲折あったけどこのルートに来れてよかったなァ」という感じです.

 全編に渡って自分語りをするわけですが,冷静に考えてしまうと小恥ずかしいので,今も「何か」を飲みながら書いています.「何か」の効力が切れる前に書き上げて投稿ボタンを押さねばなりません*1

高校以前

 競技プログラミングを始める前,とりわけ高校以前では,全くと言ってよい程プログラミングはできませんでした.計算機やプログラミングにいくらかの興味はあったものの,この頃のわたしにとっての計算機はほぼゲーム機のようなものでした.適当に gg って出たサイトを頼りにコンパイラをインストールしたり,サンプルコードを打ち込んで動くのを確認したりするぐらいはした記憶がありますが,作りたいものがあったわけでもなく,「問題を解く楽しさ」にも出会えていなかったので,この時点でプログラミングにハマることはありませんでした.
 ではこの頃何をしていたかというと,吹奏楽部に所属していて,時期によっては 1 日あたり 10 時間ぐらいトランペットを吹いていました.練習時間が物語るように,いわゆるガチ勢寄りの部活で,県央大会では常に 1 位通過,県大会では上位大会にギリギリ進めない程度の上位*2という感じでした.他に,幼少のころから続けていたピアノを弾いたり*3Bel Canto という歌唱法を練習したりしていました.
 時間の使い方を間違えていて常に寝不足でしたので,授業中に寝る生活をしていて学生……もとい生徒としてはいわゆる「落ちこぼれ」の部類でした.移動教室だった理科で物理を選択していたのに,起きたら生物の授業が始まっていたのはよい思い出です.

 音楽家にでもなろうかという勢いでしたが,計算機やプログラミングに多少の興味があったことと打算的な思考が重なって,情報工学科への進学を決めました.もちろん受験を突破するような学力はありませんでしたので,かろうじて足りていた評定平均を使って,地元の大学に AO 入試*4で入りました.
 計算機への多少の興味があったからこの選択をできたわけですが,計算機に親しむようになったきっかけはネットゲームなので,当時誘ってくれた友人氏には割と感謝しています.

学部生(競技プログラミング以前)

 そんなこんなで情報工学科へ進学し,競技プログラミングと方向性の近いルートに入りましたが,本格的に取り組むようになるのはまだ数年先のことです.とりあえず吹奏楽部に入りましたが,音楽は趣味レベルにして勉強の方をちゃんとやろうという思いがありました.
 プログラミングをちゃんと始めたのはこの頃です.わたしがいた学科では,一回生の必修科目として『C 言語Ⅰ』『C 言語Ⅱ』という講義が開講されていたからです.未だ「プログラミングにハマる要因」には出会えていないものの,スキルとしては身に付けたいと思っていた*5し,講義スケジュールによって律速されていたので,毎回の講義範囲は「きちんと理解した」と思える程度*6には予復習をしていました.

 勉強をちゃんとやりたいと思っている割に,前節のように進路をかなり適当に決めてしまっていた要因として,ある思い込みがあります.それは「大学はどこでもそれなりに高度なことを教えている」というものです.実際はある種の知能テストである入学試験によって選抜された集団に向けた講義をするわけなので,おおよそ入試偏差値によって難易度が決まります.「きちんと取り組んだときに発揮される頭の能力」で丁度よくなる講義を受けようと思ったら,ちゃんと受験勉強をしてできるだけ偏差値の高いところに行った方がよさそうだという知見を得ました.
 「講義は学びのきっかけに過ぎない」という主張もあろうとは思いますが,周囲の学生が「終わっている」ので,気持ち的につらくなります.例えば,講義中の私語がうるさい・静か*7だと思ったら,明らかに『Step Mania』をプレイしているタイプ音が聞こえる・etc ……といった具合でした.*8
 そんなこんなで,二回生のときにはすっかり萎えてしまっていて,出席回数が足りずに前期の単位を全て落とすエクストリーム学生生活*9をしていました.この時点でもう既にアレなので休学なり退学なりした方がよい気もするのですが,部活は楽しかったし人との関わりもあるからもうちょっとちゃんとしようという思いもあり,後期から少しまともになります*10

 ところで,「大学生の必修科目は麻雀」という言葉があります[要出典].ご多分に漏れずわたしも麻雀を始めて,『天鳳』をやってみたり*11,部室で打ったり*12していました.なんで唐突に麻雀の話をするのかというと,実は,麻雀を始めたことが競技プログラミングを知ることへと繋がるからです.麻雀を始めたので Twitter で麻雀界隈を見ていたわけですが,『科学する麻雀』の著者,とつげき東北さんが「ししょー」*13こと chokudai さんを promote していたのです.
 そうして競技プログラミングを知った*14わけですが,当時のわたしにはとても高尚なもののように感じられましたし,余暇的な活動としては部活に時間と労力をかけていたこともあって,まだ参加はしませんでした.興味はあったので,蟻本が発売されたときには買って「むずいー><」とか言いながら*15読んでいました.

学部三回生 - 競技プログラミングにハマる

 三回生の冬のことです.わたしはある意味,部活によって「まともなライン」に繋ぎ止められていたわけですが,この頃にその部活が崩壊し始めます*16.元から崩壊気味だったという説もあるけれども,楽器を一本買う程度にモチベーションが上がってしまい,むしろ環境に我慢できなくなって退部しました.そうして時間ができたので,「じゃあ競技プログラミングやるか」と思い,競技プログラミングを本格的に始めました.この頃から SRM にそれなりの頻度で参加するようになりましたが,本格的にハマったのは翌年の春からです.
 翌年の 3 月か 4 月頃,競技プログラミング界隈も Twitter で見ようと思って界隈を広くフォローしはじめました.これがわたしにとって決定的で,各位のツイート*17がとてもよい刺激になりました.もう一つ決定的だったこととして,TopCoder Meetup in Japan というオフ会的なイベントに参加したら,偶然にも同じ大学の学生に会ったというのがあります*18.ここで,学内で競技プログラミングに取り組んでいる集団の存在を教えてもらいました.競技プログラミングについて話し合える・競い合える人が身近にいるというのもまたよい刺激になるわけですが,幸運にも巡り会えたわけです.

 競技プログラミングに取り組んでいるうちに,

  • 人間にとって難しい問題でも,計算機の能力を使うと簡単に解ける問題がある(全探索とか)こと
  • 単純にやる(全探索とか)と計算機でも難しい(時間がかかる)問題でも,工夫すれば簡単に解ける場合があること

を知り,アルゴリズムの面白さに気付きました.と同時に,わたしが魅力を感じていたのはパズル的な面白さに対してだったので,「工学には向いてなかったのでは?」という思いが芽生えました.
 また,評価方法が客観的で明確なことも,(特に高校時代の)部活で消耗したわたしには合っていました*19
 扱っているモノ自体も,ある種のゲームとしてのシステムもわたし好みだったわけです.

そして休学へ

 競技プログラミングを始めたことはともかく,それ以前から学生としてはかなりひどい感じだったので単位数が卒研着手要件に届いておらず,四回生になっても卒研に着手できないという状態になっていました*20.また,うっかり「頭よくしたい」みたいな思いに取り憑かれてしまい,とりあえず昔やらなかった分の勉強をしようと思って,四回生後期から 1 年半ほど休学をしました.工学に向いてなさそうという予感もあって,ちゃんと勉強できたら受験しようとも思っていたのですが,結局競技プログラミングに時間を使ってしまったので,受験はダメでした*21
 とはいえ,自尊心あるいは承認欲求を満たせてしまう程度には競技プログラミングで強くなれていた*22こともあって,休学期間が終わる頃には割と前向きな気持ちになっていました.とりあえず卒業して,(自分の中での)相対的な長所を活かせるところに進学しようという気持ちになっていました.

復学 ~ 現在

 と,いうことで復学です.ちなみにこのとき,「復学した瞬間に留年する」という状態になっていました.
 既に方向性は決まっているので,この先の期間について書くべきことはあまりありません.
 卒業に必要な単位を前期でおおよそ取りきり,後期はやることが無かったので,今度は前向きな休学(?)をしました.頭を使うことに慣れてきたのか,前期の成績は割と良かったです*23

 翌年の春に復学して研究室に配属されたわけですが,卒研時代には特別なことは起こっていないし,闇なので端折ります.希望した研究室はアルゴリズム系かと思いきやそんなことはなく,わたしには向いてなかった…….
 卒研自体は特に滞りなく進んだし,外部の大学院入試を受けて無事に合格していたので,ようやく卒業して進学となります.

 今は,山奥に隠れ住みながら情報科学を専攻しています.研究室は理論系で,無事,自分に合ったところに落ち着けています.めでたしめでたし.

まとめ

 今は学問の徒の端くれということになりましょうが,学問への興味は競技プログラミングを通して得たようなものです.もし競技プログラミングに出会えなかったら,今頃は何していたか分からないというか,ろくなことになっていなかった気がします.競技プログラミングに出会うまでの全ての幸運に感謝しつつ,筆を置こうと思います.
 ということで,以上,長大な自分語りでした.ここまでお読みくださった方,ありがとうございました.

*1:この部分を書いてから本文を書き始めたけど,全然間に合わなかったので結局 3 杯飲んだ

*2:俗に言う「ダメ金」というやつ.とても悲しい気持ちになるし,「選抜ラインと金賞のラインを同じにすればいいのに」と思わないでもない.というか,今見たらあの大会でダメ金とったの一校だけだったし本当につらい

*3:経験年数の割に下手

*4:名前を書くと入学できる制度[要出典]

*5:冷静に考えると目的が不明なのだけれども

*6:e.g. for ループの場合,for という構文の機能(初期化・条件判定・更新式)がどう組み合わさって繰り返し処理を実現しているのか理解する程度

*7:みんな寝ている

*8:周りの環境はただ「そうある」だけのもので,単に自分の選択ミスなのですが,それ故に無力感がある

*9:むしろ学生ではないのでは???

*10:それでも足りてなかったけど

*11:最終的に四段ぐらいだった.当時のアカウントは放置したので消えた

*12:本当はダメなので,バレると「めっ」される

*13:@chokudai/弟子 on Twitter

*14:このときは「競技プログラミング」という言葉は知らず「プログラミングコンテスト」という名称ででしたが

*15:過去に勉強をサボっていて思考力的なものが育っていなかった(?)ツケが来ている

*16:個人練習の日に 3 人しか来ないとか

*17:普段からのモチベーションの高さとか,コンテスト前後の盛り上がりとか

*18:本当にびっくりした

*19:「指揮者が嫌われていると点が下がる」みたいなことが起こらない

*20:しかしまだ留年ではない

*21:自分のいる大学には受かる,みたいなレベルだった

*22:閾値が低い

*23:半期だけなら GPA 3.7 ぐらいだった.1 科目,講義スタイルがひどくて出なくなったので落とした以外は全て S (優)