1.はじめに
12/2に開催された第2回緑以下コンテストの運営に参加し、そこで初めての作問をしたのでその途中で思ったことなどを書いていこうと思います。作問してみたいが何から始めればいいのかが分からない人の参考になればうれしいです。
2.Extra-D(自分の問題)について
2-0.運営に参加することになる
緑以下コンの主催のくしらっちょさんの運営募集ツイートを見かけ、参加することに。
2-1.題材を考える
初めての作問で何もわからなかったのでとりあえず題材から考えることにした。自分の個性を生かそうとし、数学路線で考えてみた結果、カタラン数を題材にすることに決定。
この時点で既に6問ほど作られており、少し焦る。ちなみにこの時点できょさんが2問(最終的なDとK)を作っていた。すごい。
2-2.どういう形式でカタラン数を活用するか
カタラン数といえば受験数学でグリッド上の移動経路で出てきたな、と思い、直線上の点を通らない移動経路にすることに。ただカタラン数の知識問題にすると面白くないと思い、運営のdiscordに投げたのが下の問題。
で、それに対する反応が
2400!?
そんな馬鹿な、と思うも、、、
そ、そんな……
とりあえずa=1としておくも、そもそもカタラン数を貼るだけで青以上、となるとどうしようもない気がしてくる。
グリッドDPにすれば緑になるだろ!と思うもそれだと面白みがなくなり、一旦保留に置かれることに。
2-3.Extraで使えることに
このまま没になるのかと思われたが、1か月以上経ってメインの問題作成が進んできたところで全完者用のおまけ問題として何問か使えることに。
さらに問題ページを作ることに。
2-4.問題ページ作成
問題文と制約、サンプルケースはテンプレート通りに書くだけなので割愛、テストケース作りに取り掛かる。
とりあえずこの記事を参考にやってみるも、何故か複数ファイルに対する実行が出来なかったので手動でコピペすることに。テストケース生成にかなり時間がかかる(N=1e5のケース1個で5分くらいかかった)ので、
- テストケース生成コードの実行時のオプションで「> in.txt」とかで出力
- 想定解のコードで「< in.txt > out.txt」として実行
- in.txtとout.txtをコピペし、random01などと名前を付けて保存
とするのが良さそう。これで1ケース6分くらい、20ケース作るとすると2時間かかるのでまとまった時間を取ってからやりましょう
2-5.解説ページ作成
あとは解説を作り(ここは問題文と同じで普通に書くだけ)、想定解で通ることを確認して想定解に指定すればひとまず完成、想定解の提出はマクロを使わずに書くのが一般的なのでオーバーフローに注意。僕は何も考えずにintを使ったらオーバーフローしてテストケースの解答側を全て直す羽目になりました。
テスターにURLを送ってフォーマット(変数の前後に半角スペースを入れる、とか)の修正案をもらい、直して完成!
3.Extra-A,Bについて
原案はそれぞれループさんとはちじさんで、僕が代理でページを作ったので一応紹介しておきます。
3-1.Extra-A はじめてのおつかいHard
本編のIの完成版として考えられていたのがExtraに入り、ページを作ることに。
問題自体はそこまで難しくなかったが、テストケース作成に苦労した。
Nが2e5、Mがmin(N(N-1),2e5)なので最大ケースとしてN=2e5のケースとNが小さくM=N(N-1)になっているケースを用意しなければならなかった。
最終的に運営の中でも良問だという評価になった。Extraの中でも簡単(水下位?)だったことからかなりの方に解いて頂けて(ページ作っただけだけど)嬉しいです。
3-2.Extra-B 最大最大公約数
実はこれのページを作る時点では解法に自信がなく、はちじさんに確認を取ってからスタート。
これもテストケース作りが少し面倒で、
- とりあえずランダムにAを取ったケース
- Aを特定の値にし、最大K回ランダムな項を+1or-1する、としたケース
の2つを作る必要があり、それぞれに合わせたテスト作成コードを書いた。解いた人はhand01を見ると面白いかもしれません。
ちなみにこの問題の計算量の見積もり(解説の最後でd(x)と書いている部分)にはこの記事を参考にしました。
あとこの問題のタイトルは「GCD Maximizer」だったんですが、Maximizerって(Maximizeの派生として)存在しないんですね。かなしい。
結果的に水中位(K<Nに気づければ緑中位?)くらいにはなったと思っていて、正直今回のExtraの中で一番お気に入りの問題になりました。
ところでこんな問題があって……(こっちはかなり難しそうですが)
4.作問上の注意点
- とにかく自分より強い人に見てもらう
- AtCoderで既出かどうかのチェックも怠らない(これはテスター時も)
- サンプルケースの1つ目には簡単な説明を書く
- テストケースは20個以上用意する(ランダム10個、Nが最大/最小5個ずつとか)
- 出来ればコーナーケースも用意したい(思いつけば)
- テストケースは1個ずつ確実に保存してからページを移動する(1敗)(2時間の努力が消し飛びます)
5.これから作問したい人に言いたいこと
- とりあえず原案が出来たらTwitter(現X)で放流するか、(少し大変だけど)yukicoderで問題ページを作るかをしましょう。そのためのSNS、そのためのyukicoderです。(一応MojaCoderのほうが気軽に投稿出来るらしいです)
- 困ったことがあったらSNS上で聞いてみましょう。教えてくれる優しい人がいるはずです。(僕に聞いてもらっても良いですが、まともなアドバイスをできるとは限りません)
- 最近はオンサイトの機運が高まっている(気がする)ので、運営に参加できそうならとりあえず参加しておくと不可抗力で作問できるのでおすすめです。うまく作問できなくてもテスターの経験になるし、界隈の人と仲良くなれるので参加するだけ得かも?
- もっと知りたいことがあったら気軽にDMください。加筆するかもしれません。あと間違ったこと言ってたらこっそり教えてください