2013/10/13

ARC#015とABC#001に思うこと

ARC#015のB,Cと、ABC#001の全問の出題を担当していました。遅ればせながら、出題意図などを紹介します。解説はchokudaiさんが良いものを作ってくれているので、そちらをご覧ください。また、この記事はAtcoder社の公式の記事ではなく、あくまでAtcoderを応援する一人のWriterの心情です。この記事に書いていることについて、Atcoder社になにか言うのはお控え下さい。


〜ARC #015について〜
問題はこちらのとおりです。Bはともかく、Cはエグイ問題だったという意見が多いですね。解説はこちらを参考になさってください。

<B問題について>
・ABCで面倒と言われているBやCに負けず劣らず面倒な問題だったと思うのですが、どうだったでしょうか。

・私は、ARCのB問題ぐらいの位置には「プログラミングの慣れで差がつくが、アルゴリズムといったアルゴリズムは要しない」ぐらいの問題がいい、と感じます。このARCについては、自分で問題を割りつけたわけではありませんが、適切な位置取りの問題だと思います。

<C問題について>
・自分の作った原案では、Nは20以下としていました。また、全部int(またはその有理数)で処理できるように制約をつけてもいいと感じましたが、ひとまず作らずに渡していました。

・そうすると、出された位置はCで、しかしdoubleなどをうまく考えて使わなければならない問題となっていました。これは厳しかったのではないかと思います。より難易度の高いDがあったので、結果的にCになったようですが、実際は少々正解者が多めの(?)Dとして出題しても良かったのではないかと思います。

・C問題向けに、きちんと制約をつけておくべきだったかもしれない、と終わった後に思いました。

〜ABC #001について〜
問題はこちらのとおりです。解説はこちらを参考になさってください。
<出題意図>
・プログラミングについてひと通り学んだだけの人(以下、これを初心者という事にします)に「プログラミングで競うという世界もある」ということを知ってもらう、という意図で出題しました。

・私が普段感じることですが、プログラミング初心者は問題そのものを面白いと言う視点がまだ身に付いていません。なので、競う楽しみを知ってもらう方に重点を起き、プログラミングへの慣れで差がつくレベルにしました。初心者が、「プログラミングには競うという楽しみ方もある」ということを知ってくれたなら、writerとしては十分です。文法を学んでいる人へのコンテスト、それが今回の私の狙いです。

・A/Bは教科書の練習問題のようなものです。文法を学んだ人であればおそらく解けるだろう問題を入り口として、「まずは、プログラミングで競うという事はどういうことなのか知って下さい」という意図にしました。慣れているかどうかでかかる時間が変わるでしょうから、差がつきます。競うことを知り、解けた嬉しさも知ってもらう、という出題です。

・Cは、愚直に組むこともできるが、工夫してうまく組んで欲しいという意図で出しました。規則性や配列を使って面倒な条件を手早く処理することと、うまく整数だけに持って行って誤差の呪縛から解放されること、その二つを工夫として求めています(うまいコーディングと、適切な誤差の処理、どちらも競技プログラミングで必須ですよね。)。ただ、それを思いつかなくて終わりというのだと初心者にはしんどいかと思ったので、ゴリゴリ力づくで解けるようにもしました。それが、慣れた人からの難色にもつながったのでは、と思っています。

・Dも似たりよったりで、標準のソート関数を使えば、出力例に書いているような手順で答えが出るようにしています。しかし、アルゴを工夫して、塗りつぶしの解法やいもす法などを知ってもらうことで、競技プログラミングに一歩近づくのではと思っての出題です。最初の段階では、後半の「アルゴを工夫」にもっと重点をおいて、比較ソートダメという風にしようかと考えたのですが、O(N log N)を落とすのが難しいと考え、このような位置づけになりました。解説により、新しいアルゴリズムを知ってもらえればと思います。

・つまり、A/Bは「競う楽しみ」を知ってもらって競技に入ってもらい、C/Dは「工夫してうまく解く重要性」を理解してもらって競技につなげようという形です。

・全体としての難易度は、緑コーダーが全完できる程度を目指したつもりです(当初はもう少し上で、青コーダーで全完、というぐらいにするつもりでしたが、Atcoder社の意見で下げました)。全完者もそこそこいたので、この難易度は達成できたのかなと感じています。

<感想に対する感想>
・最初はストーリーをつけていたのですが、問題文が長くなると判断されたので削りました。ただ、一緒に考えていた人たちに「背景がないとBとか意味がわからない」といわれたことと、私自身、A/Bなどは特に背景がないと、教科書の練習問題をコピーしただけになるかなと思って、背景だけはいれました。このあたり、シンプルなのがいい人と、ストーリーなどがあったほうがいい人とがいるので、考慮が難しいなと感じます。

・そのA/Bについては、あまり反応が見られませんでした。わざわざ言及するまでもないぐらい簡単、という事なのかもしれません。入り口の問題としてはきちんと役目を果たしていたのかなと思います。

・C問題がうんざりするという声を多く聞きました。感想を読んで、角度は規則に気づいてもらえるように書いたほうが良かったか、風速は別の分類を持ってきたほうが良かったかと、反省しています。例えば、風速に応じて「やや強い」「強い」「非常に強い(暴風)」「猛烈な」という表現がありますので、そちらを判断させる問題にしても良かったのかな、と感じています。なお、非常に美しく書いている例がありましたので、紹介しておきます。

・C問題に詰め込み過ぎという意見もあり、そこも反省点の一つです。私は、C問題に対して「規則性や配列を利用して効率よくコーディングする」「誤差をうまく回避し、風程に直して処理する」の2つの観点を持ち込んでいましたが、どちらか一方でも良かったのかなぁと思います。

・Cについては「業務などではもっと面倒なものを組むのだから、Cぐらい面倒でも何でもない」という声も聞かれました。色々な観点があるかと思うのですが、アルゴリズムを重視する学生さんなどから見れば「面倒な問題」、プログラミングという方向で見ている人から見れば「修行的な組み方もできるが、プログラミング力を要する問題」というふうに見えたのでは、と思います。事実、自分の目で確認した範囲では、評価の割れ方は↑の立場とよく合っています。

・一方で、D問題は良いという声を多く見て、ほっとしています。同じアルゴリズムでも、言語によって通らないことがあった、と聞きました。Nの最大値30000というのは、バブルソートが通らないぐらいを目指したのですが、CやC++だと通ってしまうみたい?ということで、難しい問題だと思っています。

・割と競技に慣れている人からは、心配する声、応援する声、つまらないという声が多かったように思います。一方、初心者の方もいろいろな声がありまして、なかなか難しいものだなと感じた次第です。ただ、楽しかったという声には随分励まされましたし、2回目を望む声も聞かれて、作問した甲斐があったと思いました。

・「アルゴリズムコンテストではなく、プログラミングコンテストである」という評がありました。Cなどは、アルゴリズムの問題ではないが、面倒なものをうまく組むなどの工夫を要する、というのがあったのかもしれません。この評を見た時、私の意図はうまく生きているなと、ホッとしました。

〜最後に〜
最後になりましたが、今回このような機会を与えてくれたAtcoder社、開催に協力していただいた方々ならびに参加された方に感謝いたします。未熟なWriterではありますが、様々に会話の俎上に乗せていただいていること、嬉しく思っています。今後、またWriterとして、それ以上にContestantとしてお会いすることもありましょうが、その時にも楽しい時間を過ごせればと思っています。ありがとうございました。

0 件のコメント:

コメントを投稿