physics0523's 精進ログ

主に競プロの面白い問題の解法をメモします

こどふぉWriter体験記 ~ 競プロ公式コンのつくりかた

先日、私がいわゆる公式な(Ratedな)コンテストとしては初めて、Writerを務めさせて頂いた Codeforces Round #654 (Div. 2) 、お楽しみいただけたでしょうか? 参加できなかったという方も問題に挑戦していただけると嬉しい気持ちになります。

さて、今回はコンテストを準備し、開くまでの実体験を交えながら、その工程や舞台裏を日本人向けにまとめてみようと思います。競技プログラミングのWriterに興味のある方はぜひご活用していただき、無い方も工場見学的視点で楽しんでいただければと思います!

 

産まれる 2002/05/23 (コンテストまであと6614日)

この日、僕が産まれました。産まれてこなければWriterにはなれません。

ただ、この過程については多くの読者がクリアしていると思うので、詳細はパスします。

英語を勉強する 2004年頃~(コンテストまであと約6000~日)

僕が多分初めて英語に触れたのが2003年やら2004年とかやらの幼児用教材とかだと思います。それからかれこれ16~7年?英語には触れています。が、ジョークに見えて実はここってけっこう大事な項目です。特に海外コンのWriterに挑戦するときはやりとりが基本英語です。しんどい。コンテスト当時英検2級(準1に、通らない…)だったのですが、このくらいあればある程度はやっていけると思います。というよりかはどっちかというと大学入試や英検のWriting部分の自由英作文とかそんな感じのものがある程度自分なりに伝えようとして書ければ充分かと思います(逆に英検に受かれてもWritingが苦手だと苦労しそう)。要するに、自分の考えをある程度英訳して伝える必要があります。

競技プログラミングに手を染める 2015/06/02 (コンテストまであと1856日)

この日、AOJに競技プログラマー「physics0523」が産まれました。競技プログラミングを始めないとWriterにはなれません。

 

と、お遊びはここまでにして、ここからの項目は割とちゃんとした工程です。

 

CodeforcesでのWriter資格を得る 2018/02/20 (コンテストまであと862日)

CodeforcesでWriterをしたい!」と思っても、いくつか条件があります。この条件はミドリムシさんの CodeforcesのWriter公募に応募する がかなりわかりやすいです。この文章の原本は For contest writers: proposal tracking system です。青コーダーになっており、かつ25回コンテストに出場している場合はWriterとして問題を提案することが可能になります。(レートが上がると、参加回数条件が緩和されます)

実際に、コンテストを提案する 2019/12/03 (コンテストまであと211日)

先ほどの記事にもあった、コンテスト提案ページから、最低5問以上を合わせて(Div1+2併催型の場合は、双方のラウンドで5問以上となるべきことに注意してください)提案します。問題の提案フォームに問題案(問題草案+解法+おおよその難易度+(あれば)出典)をいくつか追加した上で「コンテストの提案」を作り、その中に問題を移していきます。最後にステータスをdraft(下書き)からreview(レビューを受けられる状態)にしてコンテスト案がCodeforcesのスタッフ側に開示されるようにする必要があることをお忘れなく。ここでは問題を解くプログラムを実際に書く必要はありません。

 

このあと、実際にレビューを受けるまで、通常2週間ほどという説明が提案ページにあるのですが、僕の場合は4ヶ月かかりました。気長に待ちましょう。

コーディネーターさんとマッチング、フィードバックを受ける 2020/04/11 (コンテストまであと81日)

こどふぉのコンテスト告知ブログを見ていると、ちらちら "coordinator" という役割が出てきます。彼らは何を我々Writerに対してするかというと、問題に対する指摘や問題の選別、さらには改善案などいろいろとフィードバックを行い、コンテスト全体をまとめ上げる役割にあたる存在です。めちゃくちゃ技量要りそう。実際僕も多々コーディネーターさんには助けられました。

さて、問題に対してはけっこういろんなフィードバックがあります。例えば「この問題は採用できる」とか「この問題はwell-knownすぎる」とか、「この問題はこんな改善ができる」とか… これを受けてWriterは次にする仕事が決まります。僕はこの段階で採用されたのが6問中2問でした…(コンテスト本番でのDとFです)

(難易度的に)足りない問題を作っていく 2020/04/11~ (コンテストまであと81~日)

けっこう採用のハードルは高く、問題自体が典型とあまりに同一感があると採用されない傾向にあります。結構強く「面白みがある問題」を作ることを意識しながら作問するといいでしょう。これで僕は結局31問ほど提案し、採用されたのが6問です。(途中からは「このくらいの難易度の問題が必要」という条件付きで、かつ落ちることを見越して複数問提案していました…相当な作問マシンガンになってたと思います…)これを見越して初めからけっこう多めに問題を提案するのも手かもしれません。多くて困ることは多分ないと思います。ちなみにこの没問たちは近々各所で放流していこうと思います。

コーディネーターさんは恐らく同時に複数のコンテストを回しているっぽくて、けっこうちょくちょく問題案を出しながらアピールしてフィードバックを貰ってました。(僕の場合、この段階ではフィードバックを3~5日に1回くらい貰っていましたが、このへんコーディネーターさんによって多分違います。)

問題案が出そろい、作問作業開始 2020/05/15 (コンテストまであと47日)

晴れて、問題案が出そろいました。ここで、遂に問題を実際に準備する段階に入れます。やったぜ。

ここで使うのが Polygon というシステム(Polygon自体はこどふぉの公式専用のものではない)なのですが、クッソ便利。いやもう信じられないくらい便利。マジで便利だけど具体的な使い方をちゃんと説明すると記事が一本書けてしまうので、気が向けば使い方の記事を書きます。そのPolygon上で問題文を書いたりテストケースを作ったりいろいろ出来ます。ただ、難点としてPolygon上で作問した後に生成されるPackageというものをそのまま移植できるオンラインジャッジをCodeforces以外にまだ見たことがありません。 10 Reasons to Prepare Problems in Polygon みたいな記事もMike本人によって書かれています。気になったらご一読、お試しを。

Tester作業開始 2020/05/26 (コンテストまで36日)

ここからTester作業が始まります。Testerが何人か、何らかの方法で選ばれ、そのTester達がバーチャルコンテストをすることでテストが行われます。ここで、問題セットの問題点を洗い出してもらって、その問題点がコーディネーターさんを通じてか、Writer本人に直接何らかの手段を使って伝えられます。Writerはそれを受けて問題をより良いものにしていきます。

コンテスト告知 2020/06/17 (コンテストまで14日)

ひとしきりTester作業が終わると、コンテストの日程の相談を行ったあと、遂に、Upcoming Contest欄にコンテストが現れます。めっちゃわくわくする。

露語への翻訳  2020/06/28 (コンテストまであと3日)

だいたいこのあたりのタイミングでロシア語にも問題文の翻訳が行われます。Writerの僕は翻訳まではやる必要がありません。露語はできなくても大丈夫です。翻訳は実は一番最後の工程。これはCodechefで示されているワークフローでも同じで、多分他の競プロサイトでもそうでしょう。

参加登録開始 2020/06/30 (コンテストまであと1日)

ここからContestantの参加登録が始まります。最近のRoundではだいたいコンテストの36~48時間前に登録開始になるケースが多いです。最近は参加者が20000人を超えてくるので、恐ろしい。甲子園球場の半分近く埋まってるようなもん。そう考えると改めて恐ろしいな…

告知blogを書く 2020/06/30 (コンテストまであと1日)

Hello, Codeforces!してみたくありませんか?この工程ではコンテストの開催を知らせるいつものブログをWriterが投稿します。こどふぉのHomeに掲載されたりするので、このあたりからいよいよガチで現実感が出てきます。貢献度ポイント(contribution)もよっぽどのヤバいコンテストにならない限りはめっちゃ上がります。

いざ、コンテスト! 2020/07/01 (コンテスト本番)

いよいよコンテストです。ここでやることは主に質問対応です。質問はコーディネーターさんと一緒に対応することになります。僕の#654の場合は300質問ほど飛んできました。リーディングの問題を無限本ノックしているみたいな感じでめっちゃしんどかった…

合間を縫って順位表とかACカウントとかを見てにやにやできます。これがWriterの特権です。にやにや。

解説をpublishする 2020/07/02 (コンテスト終了後)

最後に解説のblogを投稿することになります。といっても、予めPolygonに解説を書いておくので、Polygonから解説のデータを読み込むためのテンプレートを書き換えてやれば基本的には事足ります。

これにてコンテスト完了です!おつかれさまでした!

 

と、ざっとこんな感じでしょうか。

さいごに

今回僕が思い切ってこどふぉのWriterになってみよう!と思ったのにはいろいろと経緯はあるのですが、何より「海外コンに殴り込みに行く」という挑戦と「Writerの苦悩をちゃんと経験してみたい」というあたりが大きかったです。正直自分で予想していたのよりはるかに素晴らしい経験でした!

ちなみに、単独(1人)でWriterをするとなると、けっこう激務って感じの仕事量だったので、複数人Roundが多いのもたぶんそういうことなんでしょう。ちょいMで激務をを経験してみたいなら単独がおすすめで、楽しく挑戦してみたいなら複数かな~という感じです。

 

だいぶ散文って感じの記事でしたが、楽しんでいただけていたなら幸いです。