見出し画像

1000人を熱狂させる問題はこうして作る – AHC Writer の奮闘記

こんにちは!アルゴリズムチームのサブチームリードとしてお仕事をしているです。現在は主にアルゴリズムチームのマネジメントやメンバーへの技術的アドバイスなどを行っています。

さて、ALGO ARTIS は2025/1/19に世界有数の競技プログラミングコンテストサイトであるAtCoderでALGO ARTIS プログラミングコンテスト2025 冬 (AHC041) を開催しました。当日は1,000名を超える多くの方にご参加頂き、盛況のうちに終えることができました。ご参加くださった皆様、ありがとうございました!

今回開催したプログラミングコンテストについて簡単に説明をしますと、ある問題が1つ与えられ、その問題に対してできるだけ良い答えを出力する最適化プログラムを書いて、そのスコアを競うコンテストです。ALGO ARTIS が主催するコンテストでは毎回恒例で私が問題作成担当者になっているのですが、問題作成担当者が何をやっているのかについてはなかなか外から見えづらいかと思いますので、今回は担当者がどうやって問題を作成しているのか時系列順に紹介していきます。

このような記事に需要があるかは気にしません。私がしゃべりたいのでしゃべります。以下、やや砕けた文章で説明していきますがご了承ください。

今回のコンテストの解法を可視化した動画(基本的に赤い点が多いほど高得点)

用語について

競技プログラミング特有の単語がいくつか出てきますので、ここで予め説明しておきます。

  • 競技プログラミング: 与えられた課題に対し、それを解決するプログラムを作成し、その速度や正確さ、性能などを競う競技。単純なプログラミング能力に加え、考察力や数学的適性なども求められる。

  • AtCoder: 日本に本社を構える、世界有数の競技プログラミングコンテストサイト。開催されているコンテスト内容についてはAtCoder社のサイトも参照。

  • AHC: AtCoder Heuristic Contestの略。ヒューリスティック最適化のスキルを競うプログラミングコンテスト。

  • writer: コンテストの問題作成担当者。今回は松尾が担当。

  • tester: コンテストの問題のテストプレイやアドバイスなどをする担当者。

  • admin: AtCoder社に所属する、コンテスト全体の責任者。提案された問題の採否の判断などを行う。

  • レーティング: AtCoderユーザーの強さの指標を表す数値。

  • ビジュアライザ: 最適化プログラムが数値で出力した結果を人間にも理解しやすくするために可視化するプログラム。

AHC writerになるために

2022/02/26 橙コーダーになる

AtCoderユーザーはそのレーティングによって色分けがされており、下から順に灰・茶・緑・水・青・黄・橙・赤となっています。AHCでwriterの資格を得るには今のところ橙以上になっている必要があるので、まずは橙コーダーになりましょう。

AHCの橙コーダーはランキングの上位100名強、比率にして2%程度のユーザーしかなることのできないレベルです。典型的な手法を単に問題に当てはめて使うことができるだけではなく、自分がやりたいことを実現するための道具として、手足のように自由自在に活用できるようになる必要があります。どんどんコンテストに出て、どんどん他人の解法や試行錯誤のやりかたを吸収し、強くなりましょう。問題を解いて解法を学ぶのはもちろん、他の人の参加記を読んで思考過程をトレースし、アプローチに再現性を持たせるのもオススメです。

なおこれは自慢なのですが、私は現在ランキング2位の赤コーダーです。

2022/07/30 有志サイトでコンテストを開く

橙コーダーになっても、いきなり公式でコンテストを開くのはハードルが高い……という方もいるかもしれません。そういうときは有志が運営しているコンテストサイトに問題を出すのも一つの手です。私の場合、yukicoderという老舗の有志コンテストサイトでコンテストを開催させて頂きました。当時のコンテストページはこちらです。

コンテスト当日は80人近くの方にご参加頂き、管理人のyuki2006さん・testerの物理好きさんにご助力頂いたおかげで無事成功させることができました。
橙でなくても誰でも出題することができますし、作問のプレッシャーも公式コンテストほどではないですし、原案作成・問題文作成・ジャッジ作成・ビジュアライザ作成と一通り体験できるのでオススメです。何より楽しい!

ここから下では私の問題作成方法について書いていくのですが、有志サイトで開くのであればここまで肩肘張らずに気軽に出題して全く問題ないと思います。分からないこともきっとtesterの方が教えてくれます。是非チャレンジしてみてください!

AHC writer準備作業

〜2024/11下旬 ネタ出し

私は今のところ半年に一回ペースで作問を行っているのですが、作問作業はまずネタ出しから始まります。ここで良いネタが出てこないとその後どう頑張っても面白い問題になりようがないので、一番重要なプロセスです。

自分の場合、解法から問題を作ってもありきたりで面白くない問題にしかならないので、シチュエーションから問題を作っていくことがほとんどです。普段日常生活を過ごしているうちに見付けたコンテストの問題にできそうなネタをメモアプリに書き留めていったりするのですが、私の場合それだけだと十分ネタが集まらないので、ガッツリ時間を取ってネタ出しをすることが多いです。

まずはとにかくネタを出すフェーズなので、面白くなりそうかはある程度考慮しつつも、ひたすら数を増やしていきます。ネタの方向性は何でも良いのですが、何かテーマがあると考えやすいので季節のイベントをテーマにしてネタ出しすることが多いです。去年の冬に出題した問題は書き初め、今年の冬に出題した問題はクリスマスツリーですね。

このフェーズで20〜40個くらいはネタを作ります。これだけネタを作っても、最終的にモノになるのは1個あるかないかくらいですね。

〜2024/12中旬 テストプレイ

とりあえずネタをたくさん作ったあとは、テストプレイで面白い問題を選別していくことになります。

まず、各ネタについて軽く解法の考察を行っていき、実装が重すぎるもの・簡単すぎるもの・逆に難しすぎて工夫のしようがないものをササッと除外します。短期コンの難易度調整は難しくて、「実装の軽さ」「問題としての奥の深さ」というある意味相反する要素を両立させなければなりません。難易度も単に上位陣が満点を取れないように難しくすれば良いというものではなく、考察次第で色々工夫できる余地を残さなければなりません。この時点で既にネタの8〜9割ほどが脱落します。

さらに生き残ったネタたちに対して、もう少し肉付けをした上でテストプレイを行っていきます。ネタの段階では1行〜数行程度の簡素なものしかないので、問題のサイズや制約条件、スコアなど諸々決めつつテストプレイとして解いていきます。

テストプレイをする際は普段のコンテストとは異なり、貪欲法などの比較的シンプルな解法から少しずつレベルアップしていく解き方をすることが多いです。コンテストを開くにあたっては上級者だけが楽しめる問題を作れば良いというわけではなく、初心者も色々工夫できて面白いと感じてもらえるような問題を作る必要があるためです。初心者にとって工夫の余地のない問題はここで脱落しますし、逆に上級者の間で差が付かないような深みのない問題も脱落します。

なお、問題サイズの数値は最初は勘でなんとなく決めてしまいます。案外勘で決めた値からブレなかったりするのですが、場合によっては変えた方が良さそうと感じることもあり、必要に応じてパラメータやスコア計算式をいじったりして問題作成とテストプレイを行ったり来たりします。
よく「作問時の4時間でどのくらいのスコアになりましたか?」とか、「何時間くらいでこの点数になりましたか?」といった質問を頂くのですが、作問とテストプレイの境界が曖昧だったり、上述の通り色々な解法を試しながら解いていたりするので、明確な回答は難しかったりします。

という流れでテストプレイを行っていき、ちゃんと面白くなりそうであれば通過、そうでなければ別の問題でテストプレイをひたすら繰り返します。ネタ出しの中で考えたネタの中に当たりが入っていれば良いのですが、ない場合はもう一度ネタ出しからやり直します(つらい……)。今回も行けそうと思っていたネタが思ったより面白くなくボツにした結果、途中で一度ネタが全て尽きてしまい、締切が結構ヤバかったです……。

〜2024/12下旬 問題原案の体裁整備・共有

無事テストプレイが終わったらadminのwataさんに問題原案を共有するのですが、この時点では問題が脳内にしかなかったり、参加者の提出を採点する採点プログラムが仮実装だったりするので、他人が見ても分かるように体裁を整えていきます。

ここは手を動かせば進みます。全ボツも有り得るネタ出しと違って、やれば終わるので頑張りましょう。

2024/12末 wataさんの解法にボロ負けする

wataさんがテストプレイした感想を教えてくださるので、「実は誰でも思い付く簡単な解法が強すぎた」などといった結果になっていないかドキドキしながら確認します。

wataさんがあまりに強すぎて、基本的に私が出したテストプレイのスコアは負けます。さすがAHCのadminと言うほかありません。私は確かにレーティング2位ではあるんですが、こんな感じなので世界2位ですとは口が裂けても言えません……。

ともあれ、自分が思い付かなかったアプローチを教えてくださったり、より面白くするためのアドバイスをしてくださったりするので、大変ありがたく思っています。同時に自分ももっと強くならないとなと感じます。

2024/12末〜2025/01初旬 高熱で倒れる

39℃を超える熱が出て1週間ほどダウンしていました。年末年始は診療所もお休みなので、最後まで病名は分からずじまい……。年末年始休暇のうちに問題をブラッシュアップする作戦だったので、正直かなりキツいです。

皆さんも体調には気を付けましょう……。

2025/01上旬〜中旬 ブラッシュアップをする

より良い解法がないか、問題設定を変えた方が面白くならないかなど考えつつ、問題・解法のブラッシュアップを試みます。出題する以上、参加者のスコアに負けたくないという気持ちもあり、そこそこ本気で問題に取り組みます。wataさんからアドバイスを頂いた上でなのでズルくはあるのですが。

この時点ではビジュアライザもUIを持たない仮実装だったりするので、ビジュアライザのweb UIの作成を行ったりもします。参加者の気持ちになりながらコンテスト中の考察がスムーズに進むように、けれども過剰なヒントを与えることのないように作っていきます。これも、やれば終わる系のタスクなので比較的気が楽です。

採点プログラムなどにバグがないかも丁寧にチェックしましょう。私の場合案の定web版ビジュアライザに軽微なバグが見つかりました。バグっていてコンテストがめちゃくちゃになってしまうと目も当てられないので、かなり気を遣います。

ちょうど同じくらいの時期に競プロ新年会テックトークスライド作成も行う必要があったので、かなりバタバタでした……。

2025/01中旬 解説放送の資料を作る

ALGO ARTIS プログラミングコンテストでは毎回コンテスト後に解説放送を行っているので、そこで使用する解説スライドの作成を行いました。特に初心者〜中級者帯の方に「なるほど!」と思ってもらいたくて作っているのですが、いかがでしたでしょうか?

別に解説スライドはなくても大丈夫なのですが、自分の場合はアドリブ力にそこまで自信がないのでそれなりに丁寧に作ります。「似た解法2つだが、なぜこちらの解法の方が良いのか?」などの説明も入れると納得感が増して良いですね。

2025/01/19 コンテスト当日の流れ

質問対応

コンテスト当日は、問題の責任者として問題の内容に関する質問対応などを行っていきます。今回はAtCoderさんのオフィスにお邪魔して、wataさんと一緒に対応を行いました。

コンテスト開始直後が一番緊張します。採点プログラムにバグがあったり、問題文に不備があったりしないか不安になるためです。最初の正解者が出て、序盤の質問対応が一段落するとようやく一安心できます。

雑談タイム

4時間のコンテスト中はずっと質問対応を行うのですが、最初にいくつか質問が来たあとは基本的に質問が落ち着いて暇になるので、wataさんとコンテストの順位表を観戦しながら雑談をします。順位表で上位に上がってきた人がいたらコードを見に行き、どんな解法で解いているのかChatGPTくんに教えてもらったりしながら高みの見物をします。準備期間を含めて一番楽しい時間で、このためにwriterをやっていると言っても過言ではありません。今回も私が予想もしなかった解法で高得点を取っている方がいて、とても驚くとともにAHCの面白さ・奥深さを感じました。

また、ALGO ARTIS メンバーの順位にも目を配ります。基本的にALGO ARTISメンバーは全員ライバルだと思っているので、ALGO ARTISメンバーが良い順位だと応援よりも悔しさの方が先に来ます。その度にALGO ARTIS  メンバーが解けないもっと難しい問題を……という気持ちになるのですが、難しくしすぎると初心者〜中級者帯の方が楽しめなくなってしまうので自制しています。

順位表の最上位層は黄〜赤コーダーの実力者だらけ。人によって解法が全然違うため、いろんな人の解法を眺めるのがとても楽しいです。

解説放送

コンテストが終わると、しばらく休憩したのちに解説放送タイムとなります。今回はAtCoder社からwataさん・かえでさん、ALGO ARTIS から嶋田と私が出演しました。「コンテスト中に自分も同じ解法を試していた」「簡単な解法なのにこんなにスコアが上がるのか」など、皆さんから色々な反応も頂けてとても嬉しく思います。今回は忙しくて見られなかった方も、是非次回はご覧になってみてください!

おわりに

writer作業は苦しい面もありますが、自分の作った問題を1,000人を超える参加者に解いてもらうことができ、しかも自分の想像を超えたアプローチが出てくるというとても面白い趣味なので、この記事をきっかけにAHC writerに挑戦する人が増えるととても嬉しく思います。adminのwataさんからも下記コメントを頂いていますので、ご興味ある方は是非お気軽にご連絡ください!

writer募集に関しては、興味がある方は原案がまだ無くてもとりあえず気軽に連絡ください。
https://atcoder.jp/contests/ahc-survey2024

wataさんからのコメント

また、2025/02/21現在ちょうどAHC043が開催中です。明確な答えがなく、試行錯誤しながら自分のプログラムを少しずつ賢くしていくヒューリスティックコンテストは非常に楽しいので、今まで知らなかったという方にも是非ご参加頂き、この楽しさを体験して頂けますと大変嬉しく思います。

最後に、ALGO ARTIS には業務以外でもこのようなディープな技術を持ったエンジニアが多数在籍しております。業務面でも趣味面でも高い技術力を持ったメンバーと一緒に、社会基盤の最適化に挑戦していきましょう!皆様のご応募をお待ちしております。


良かったら、SNSやHPをチェックしてみてください。最新情報をご覧いただけます。また、フォローやスキ♡もお待ちしています!(スキはnoteのアカウントがなくても可能です!)

ALGO ARTIS についてhttps://www.algo-artis.com/
最適化ソリューション『Optium』https://www.algo-artis.com/service
化学業界DXソリューション『Planium』https://planium.jp/
X : https://x.com/algo_artis
Linkedin : https://www.linkedin.com/company/algo-artis/
Facebookhttps://www.facebook.com/algoartis.corporation