ゆるふわ競技プログラミングオンサイト at FORCIA #3 writer料は初任給に含まれます 参加 (作問) 記
ゆるふわ競技プログラミングオンサイト at FORCIA #3 writer料は初任給に含まれます - connpass に writer として参加しました。writer をやるのは初めてでした。記憶が薄れないうちに感想など書き殴りたいと思います。
コンテストページと解説はこちらです。
- Div. 1 https://www.hackerrank.com/yfkpo3-1
- Div. 2 https://www.hackerrank.com/yfkpo3-2
- 解説スライド https://docs.google.com/presentation/d/1P1Q29KmlCCBbLq1qtpQCC_VN6Rrg48kEqXhmsOLkMQk/
目次
1月
もうバラしてしまったので書きますが私は今年の4月から,M1 のときのインターン先であり,今回含む今まで3回のゆるふわオンサイトの会場でもある フォルシア株式会社 に就職します。御社といえばゆるふわオンサイト (かなり語弊がある) 。ということで,「今年の春 (冬) はゆるふわオンサイトやるのかな」「やるんだったら今度こそ参加したいな」*1「あと準備のお手伝いでもさせてもらって入社してからちゃんと動けるようにしようかな」などと漠然と考えていました。
しかし 1/28,あるリプライで状況が一変します。
ところでwriterしたくない?
— てんぷら (@tempura_cpp) 2020年1月28日
修論と両立できるのか,そもそも私に問題が作れるのかの2点で多少悩みましたが,割とすぐに writer をやることに決めました。2020 年の目標の記事 で
競プロの作問をする
(略)
オンサイトコンテスト or イベントに運営側で関わる (これは趣味の方に入れてもいいかもしれないけど)
などと書いていたことを思い出したのが後押しになりました。
writer をやることが決まってからは,作問の大まかな流れなどを他の人の記事を読んで勉強しながら,原案を作りました。特に参考にしたのは以下の記事です。
ゆるふわオンサイト#2 ゴリラの挑戦状 でwriterをした話 - 30歳で競プロに目覚めた霊長類のブログ
- 社員さんでもある prd さんが,前回のゆるふわオンサイトで writer をした際の記事です。ゆるふわオンサイトに参加するのは初めてだったので,イベントの雰囲気や作問の流れなどが参考になりました。
競技プログラミングにおける作問テクニックを総整理! 〜初心者から経験者まで〜 - Qiita
- 今回のゆるふわオンサイト Div. 1 のオンサイト優勝者である E869120 さんの記事です。作問の全体の流れから初心者がハマりがちな落とし穴や犯しがちなミスまで,作問についての基本がとにかく多岐にわたってまとめられています。
-
- 少し前に話題になった DEGwer 式作問法の DEGwer さんの記事です。この記事の購入により Median Permutation の原案が生えました。
1月末の地点で Median Permutation, Coupons, Bananas Multiplier の原案が生えていました。もう1つか2つ生やしていた気もしますが,ボツにしました。 てんぷらくんのほうでも Banana Game,Sweets Distribution, Yet Another Cake Division, Digit Sum Multiple の原案が生えていて,Div. 2 only の問題を除く全問題の原案が出揃いました。
それと,サブタイトルの「writer料は初任給に含まれます 」が決まったりイベントの conpass ページが公開されたのもこの辺り。今回のサブタイトルを考えたのはもう一人の writer であるてんぷらくんです。ユーモアのレートも赤くらいありそう。
見るたびに申込者が増えていて,私の曖昧な記憶だと 80 人近くの方に申し込んでいただけていたんじゃないかと思います (本当にありがとうございます)
2月
2/6 までは修論発表に追われていて,その後に本格的な作業を開始しました。私が修論発表に追われている間に席が 36 人から 55 人に増席されていたりもしました。すごい。
この地点で writer である私のレートが中央値未満であるコンテストになる可能性が高いことがわかってゆるふわとは……? となっていました。
修論発表後は,問題セットと Div 分けを仮確定させ,rime やtestlib を使ってテストケース,generator,validator,writer 解や tester 解を書いたりしていました。多分いろんなところで言われてることではありますが rime の使い方は beet さんの記事 を参考にしつつ実践して,てんぷらくんにアドバイスをもらって,を繰り返しました。
この辺の作業で,てんぷらくんは人に仕事を教えるのがうまいなあと思いました。例えば,最初にやるべきことの全体像を Slack にまとめて教えてくれたり,テストケースや writer 解を書きやすそうな問題 (今回は New Comers や Median Permutation) を使って OJT 的に仕事の流れを掴ませてくれたりとか。
セットのバランス的に 300-400 くらいの全探索問題を生やそうとしていたのですがなかなか生えず,抽選で参加者が決まったさらに後になんとか Books Rotation を生やしました。
問題が一通りできてから,tester のこるとんさんに問題を解いてもらいました。この地点で 2/21 とかだったと思います。こるとんさんからもらった指摘のおかげで問題文やサンプル,テストケースのクオリティが向上しました。ちなみにですが,こるとんさんに言われなければ Books Rotation のサンプル 3, 4 は存在しませんでした。その場合,各列の要素をカウントしただけでサンプルは通るが AC はしないという茶色あたりの方にとって意地の悪い問題になっていたかもしれません……。
当日
Prize が決まったのが前日だったので,朝からコンビニにプーさんを買い求めに行っていました。人気商品っぽいですし数日前に発売されたばかりなのでセブンイレブン5店舗ツアーを覚悟していましたが,1軒目6プーさん揃ってよかったです。
少し早めに会場に行ってOrganizer の matsu さん,社員枠の prd さん,tester のこるとんさん,参加者でお手伝いをしてくれていた nanae さんと一緒に会場準備をしました。重いテーブルを移動して並べたり,使わないものを別の場所に動かしたりなどの肉体労働でしたが,それなりにスムーズに終わりました。初回はこの準備を matsu さん一人でやっていたそうですが,あまりに偉大すぎる。
人が来始めると,流石に不安感がごまかせなくなってきました。私の問題で炎上したらどうしようとか,問題の不備で楽しくないコンテストになったらどうしようとか。
しかし実際のコンテスト中にはそんなこともなく,ほぼ平和に順位表観戦をして終わりました。Books Rotation のサンプル 0 の説明が間違っていたのでそこは申し訳ありませんでしたが,Clar をくれた方に感謝です。
解説はについては,ああいう,あんまりかっちりしてないカジュアルな場でプレゼンするのは得意ではないのですが,和やかな雰囲気で比較的フランクに話すことができてよかったです。Median Permutation で詰まった Div. 1 の方々を無自覚に煽ってしまったのはすみません……。
懇親会は約50人もの競プロer が1つの会議室に集合してワイワイ話していてすごかったです (小並感) 。懇親会では人との会話に入っていくのがなかなか大変だと思っているのですが,楽しそうな顔をしている人が多くてホッとしました。「Median Permutation が面白かった」と言ってくださる方が多くて嬉しかったです。しかし私個人の振る舞いとしては,「孤立する人を作らせない」「話したい人に話しかけにいく」のいずれも反省点が残るところなので,今後はコミュニケーションも要精進です。
Noimin がwriter の問題について
解かれ具合とか解法は解説スライドに書いたので,問題の生い立ちでも書こうかと。
Coupons
懇親会といえばピザ! なので,懇親会の準備をする matsu さんに思いを馳せて作った問題です。 灰色の人が頑張れば解けて,茶色の人が気持ちよく解けるくらいの難易度感を目指しました。
Books Rotation
セット内に全探索問題がない気がして,ちょうどいい全探索の問題を生やそうと頑張りました。
読解も実装も面倒なので,最も心配していたのがこの問題でした。が,みなさん意外と解けている。参加者の実装力を見くびっていましたかもしれません。
Median Permutation
最初にできた問題です。 DEGwer 式作問法 (最初に操作や性質を定義してそれをいじる) で作りました。
作問当初は構築 (条件を満たす数列を1つ作る) でしたが,数え上げになりました。難しくなるので出題はしませんでしたが,辞書順最小を出すという案もありました。
懇親会で面と向かって言及してもらった回数はこの問題が一番多かったです。
Bananas Multiplier
実装寄りの問題が好きなので作ろうと思っていて,原案自体はすぐに生えたのですが,問題上での設定に苦労した問題です。
結果,matsu さんと prd さんがバナナを増やすという謎の問題になりました。 増やしたバナナは Banana Game で使ってもらえてよかったです (?)
ダブリングで LCA を求めるアルゴリズムは個人的には好きなアルゴリズムの1つです。
Noimin が test した問題について
私が test した問題も最終的にはこるとんさんに改めて test していただいたので「Noimin が tester の〜」とは書きませんでした。
Yurufuwa Division
ゆるふわオンサイトのレート分けにちなんだ問題。非常にシンプルな問題なので,この問題を通してtester 業務を教わりました。
New Comers
初心者向けかつ3回目のゆるふわオンサイトにふさわしい良問。標準で備わっているデータ構造を使うのは大事です。
Banana Game
頭でゲームをこねくり回しているうちは何日も悩んだのに,それなりの規模の実験をしたらすぐに見えてきた問題。Grundy 数の式の中に山の中のバナナと激辛バナナの数の差の偶奇が現れていてちょっと不思議でした。その意味を考えるのも楽しいので,好きな問題です。
最初はバナナを使っていないゲームだったのにいつの間にかバナナと激辛バナナを食べるゲームになっていて笑いました。
その他
本当に多くの方々のおかげで,楽しい writer デビューになりました (楽しいは「writer」ではなく「デビュー」にかかっています) 。
オンサイトコンテスト作りにご協力いただいた株式会社フォルシアの方々や参加者の皆さん,本当にありがとうございました。
特に,Organize をほぼ1人でやっていた matsu さん,writer / tester のやることを手取り足取り教えてくれたもう1人の writer のてんぷらくん,テスターとして数々の本質的指摘をくれた上に何故か会場準備/片付けも手伝ってくれたこるとんさんには頭が上がりません。
次回 (夏の終わり〜秋頃?) は Noimin 回になりそうなので,今からネタ出し頑張ります。
ところで, prd さん回はバナナ,てんぷらくん回はプーさんが Prize でしたが,Noimin 回はどうなるんでしょう……?
*1:前回は申し込んでいたものの,インフルエンザに罹ってしまいキャンセルしました。