計算機でない専攻の人の、コンテストとの付き合い方

更新日時:

私の CODE RUNNER 2015 Final 1 位のことも念頭にあるのかなと思った。

私は 1 位は 1 回しか取ったことが無くて、 3 位 や 5 位 や 6 位もあるといえばある。だけど基本的にはコンテストは「弱い」方だと思っていて、 AtCoder でも初段から抜け出せていないことを考えれば明らかだと思う。

chokudai さんのおっしゃることは正しいと思う。その上で、別の視点から見て、私の意見を書いておく。

本論

前提:計算機に触れている時間

競技プログラミングを愛好する人の中には、計算機プログラミングと関係のない専攻の人たちも多い。私のように「全く関係ない」人はその中でもごくわずかだが、いるに入る。

私たちには、ハンデキャップがある。 計算機専攻の人のように、計算機に触れている時間がほとんどない ということだ。

私の大学院での研究テーマは、全く計算機と関係がない。最先端の論文を探し出し、読み、紙の上で計算して、新しいことをやって、下書きを書いて、それを何度も推敲して LaTeX で打ち込んで論文にする。この過程で、計算機プログラミングをすることは全くない。

そのような人と、望めばいくらでも研究にプログラミングを取り入れることができる人では、計算機プログラミング自体の練習量に差がつくのは仕方のないことである。計算機を研究に使っている人から見れば「プロコンと研究は違うよ〜関係ないよ〜」というかもしれないが、私の立場で見れば、 基礎体力の差に直結 しているように思う。

加えていうと、 コンテストを始めた時間にも差がある 。私がコンテストにで初めて、「自分、計算機に向いているんじゃないかな」と思い始めて来たのは修士課程 2 年の頃だった。中学生、高校生、予備校、大学教養、大学専門もとっくに過ぎ、新卒採用の内定が出ていた頃だったのである。

だから、計算機の腕前は、わずかな空き時間を削って、自分で磨いてきたということになる。湯水のように時間が使えた大学教養の頃は、数学や物理の本を必死に読んでいたし、専門でも洪水のように講義される数学の勉強をしていた。その時間を、プログラミングコンテストに全力投球できた人と、圧倒的に差がついているのは、これもまた、素直に認めなければならないことである。

例えばタイピング速度にしても、全く速度が違う。実装の経験も、コンテストに出た回数も、全く違う。コンテストにはスポーツや FPS や格闘ゲームのような側面がある。年齢を重ねた後、後追いで努力しても、時間が限られている状態ではさらに差がつく一方である。

まとめると、教養学部でプログラミングコンテストに打ち込んだり、研究で計算機に触れていたり、実務で計算機で仕事をしている人と同程度にプログラミングコンテストに私が参加し続けたところで、計算機に触れている基礎体力が違うので、勝てるようになるどころか、どんどん差が広がっていくばかりである、ということになる。

普通の人だと「こんなところで勝負するのはくだらない、有利でない、数学に没頭しよう」と不貞腐れるところかもしれないが、私は「自分の力は、他人と比べることなく、自分で高めよう」と思う。

私たちはバッハやショパンじゃないもん。君の人生で、ありったけの君で、真摯に弾けばいいんだよ。 ーー『四月は君の嘘』第 7 話

「ラッキーパンチ」は狙うもの

前の記事にも書いたけれども、私は勝てなくてもいいと思っている。自分のペースで、彼らが歩んで来た道のりを、私も登っていく。しかし、 あえてその上で、それでも、勝ちたい、優勝したい、入賞したい 、というならば、残された道はわずかしかない。

我々に残された数少ない勝ち筋は、自分に向いているコンテストで勝負することである。具体的には、 プログラムの実装で勝とうとしない ことである。

純粋にプログラムの実装で勝とうとすると、絶対に負ける。本質的に彼らと異なる方針でプログラムを組まないと、そもそも勝ち目がないのである。

しかし、方針が異なるだけでは勝てない。実装力が強い人たちよりも優良な方針を立てている必要がある。すなわち、 実装力が強い人たちが相対的に「間違えてくれる」必要 がある。 CODE RUNNER 2014, 2015 Final の場合は、どちらも大衆の行動や方針が自分の得点に影響するコンテストであった。だから「多くの人はこういう戦略を立てるだろう」と考え、それを逆用すれば、実装力が少々低くても勝てる可能性があった。 SamurAI Coding 2014-15 も同じようなものだった。強い人はモンテカルロ法を極めて来るのは明らかだから、それを逆手に取れば勝てる可能性があった。投資でいうと、逆張り、バリュー投資である。

そのための前提として、コンテストのルールが重要である。マラソンマッチであっても、高得点を取るために焼きなまし法やビームサーチを繰り出して、高速化して詰めていくのであれば、私の勝てる可能性は完全に 0 である。実装力が強い人たちが間違えてくれないからである。その逆に 知識や実装力が低い人でも勝てる可能性のあるルールの時は、優勝を狙っていく という姿勢が大事である。

そうやって狙って取る勝利は、純粋に「力」で取った勝利ではないかもしれない。だからラッキーパンチに見えてもいいし、そう評価されるの無理がない。しかし、よーく調べると、 ラッキーパンチを出した人は、だいたい複数回出している ことに、気づく人も出て来るのではないか。私は今後も同じような方針で勝利を狙っていくし、そういうコンテストが誰かによって開催されることを、見逃さずにいたいと思う。そしてその前提として、勝利できないコンテストも、不貞腐れることなく、真摯に向き合っていく。

最後に

計算機と全く関係ない専攻の人でも、プログラミングコンテストは楽しめるし、能力は高められるし、なんなら優勝だってできるかもだぞ! と言いたい。計算機と直接関係ない専攻を持つ競技プログラマが増えてくれると、今後の人類の発展にもいいと思う。

コメントする