はむ吉(のんびり)の練習ノート

プログラミングとことばに関する話題を中心に,思いついたこと,試してみたこと,学んだことを,覚え書きを兼ねてまとめます.その際に役立った,技術書,参考書,辞書,機器などの紹介も行います.

はじめてのCodeforcesコンテスト

Codeforcesでは、月に数回プログラミングコンテストが開催されています。2月7日18時5分(日本時間)から、公式のコンテストとしてCodeforces Round #342 (Div. 2)が実施され、私はそれに参加しました。この記事では、その顛末や感想について書きます。

Codeforces Round #342 (Div. 2)参加に至るまで

競技プログラミングを始めてから数か月が経ち、国内のプログラミングコンテストだけではなく、海外のコンテストにも参加してみたいと思うようになりました。海外を拠点として運営されている主なプログラミングコンテストのサイトについて軽く調べてみたところ、Codeforcesが取っつきやすいと感じました。その主な理由としては、次の点が挙げられます。

  • Codeforcesを利用するにあたって、あらかじめ特殊な拡張機能プラグインを導入する必要はない
  • Codeforcesでは標準入出力を通じて答案を提出することが多い
    • 日頃から利用しているAtCoderやyukicoderなどにおける解答形式と同じである

一つ気がかりであったのは、Codeforcesの拠点がロシアであるためか、英語の問題文がわかりにくいことがあるという点でした。とはいうものの、さほど重要なこととは考えませんでした。

そのようなわけで、ぜひCodeforcesのコンテストに参加してみたいと思うようになりました。しかしながら、個人的に忙しく、また深夜帯に公式コンテストが開催されることが多かったため、気が付けばアカウント作成から3週間ほどが経っていました。

Codeforces Round #342 (Div. 2)中の様子

あらかじめ、Codeforcesにおける公式コンテストの流れについて述べておきます。TopCoderと同様に、公式コンテスト参加者はそのRatingによりDivison 1および2に振り分けられ(初参加者は後者へ)、さらにいくつかのRoomに配置されます。制限時間は2時間であり、A-Eの5問が与えられます。TopCoderとは異なり、Python 3やHaskellを含むさまざまな言語を使用することができます。ある問題に対して提出した答案の正確性に自信があれば、この問題をLockすることができます。この操作により、その問題の答案をもはや提出できなくなりますが、その代わりにほかの参加者の答案を閲覧し適宜Hack*1を行えるようになります。

私はB-Eの各問については解法が思い浮かばなかったものの、Aについては答案を提出できました。いくつかの例を試し、どうやらその答案には問題がなさそうだと判断したので、無謀にも終了の20分ほど前に問題AをLockしました。その後同じRoomに属するほかの参加者の答案を、Hackできないかと読んでいましたが、結局Hackは行いませんでした*2。そして、終了が約5分後に迫ったころに、私の問題Aに対する答案はHackされました。先述の理由で再提出は不可能であるため、ただコンテスト終了を待つのみでした。

Codeforces Round #342 (Div. 2)の結果

私の完答数は0であり、当然ながら得点は0点でした。コンテスト終了後、Rating 1384(緑色)が付与されました。

感想

今回のコンテストでは、問題を読み取ってその趣旨をイメージすることはできませんでしたが、(まともな)解法を導き出すことはできませんでした。無論、まだまだ練習が不足していることが、その主な原因でしょう。しかし、それとは別に、いくつか反省すべき点がありました。まず、「粘り強さ」が足りなかったということです。初見ではどうしていいかわからないような問題でも、あれこれと自分で特殊な場合について根気よく考えてみると、解法が思いつくことがあります。もっともらしい答案が書けたが、いくつかの例についてテストしたところ、実は誤答であったとわかることもあります。しかし、今回のコンテストではそういった地道な作業をややおろそかにしてしまったおそれがあります。また、これとやや重なりますが、以前の記事でも述べたように、鮮やかな方法を求めてしまった感があります。今後は、このような点によく注意したうえで、問題演習やコンテストに取り組みたいと考えています。

*1:TopCoderにおけるChallengeと同様に、答案の誤りを指摘する行為です。

*2:答案のほとんどが私にとっては不慣れなC++で書かれていたため、安易にHackしてもかえって失点するおそれがあると考えました。