うにゅーん、って感じだ

だいたいのコンテストサイトで橙か赤です、よく C#を書きます。

ICPC 2021 国内予選 JSON色付け部門 参加記


ICPC 2021 国内予選 JSON 部門に参加しました。
結果は以下です。

github.com

チームメンバー

なお、ICPC 2021 国内予選 JSON 部門は本物の ICPC 国内予選 とは異なり、チーム外の人との相談問題の開示闇討ちなどなんでもありなので、チーム外の人に Pull Request を要求する、なども積極的に活用していきます。


A 問題:JSON 生成

JSON 部門だからと言って JSON を生成しなくていいわけではないので JSON を生成します。

国内予選開始の約 22 時間前 に JAG のページにチーム情報を書き込むページが生成され、そこで A 問題が公開されました。 主に以下の手順で、JSON を生成していきます。

  1. JAG のページを見にいきチーム情報を抽出する
  2. チーム情報の各ユーザーについて、AtCoder のユーザーページを見にいきレート情報を抽出する
  3. JSON にまとめて出力する

この辺は Python で行い、ページを見に行って情報を抽出する部分は pandas.read_html と BeautifulSoup のうち楽な方を適当に選んで使いました。
あとは毎回更新のたびに AtCoder に全チームの全ユーザーの分のクエリを投げるのはやばいので pickle を使って response をキャッシュしたり、これ を参考にチームレートを算出したりしました。
その辺がおおよそ以下のコードで行われています。

github.com

こうして得られた JSON を見やすいように静的ページにしたのが以下です(厳密にはそうではなく JSON に含んでいない情報も入っている)。


B 問題:JSON

国内予選開始の約 6 時間前 に国内予選の観戦者向け順位表が公開され、そこで B 問題が公開されました。

当初は A 問題を解いた時点で撤退するつもりだったのですが、解きたくなってきてしまったためさっと取り掛かります。
去年のアジア地区のときに TumoiYorozu さんが同じような userscript を作っていたので、そこからコードをパクリ、適宜今回の順位表のフォーマットに合わせることで無事 AC。 (コードの細かい内容はほぼ理解していない……)


C 問題:通過判定

ここにきてようやく競技プログラミングっぽい問題が登場しますが、見るからにめんどくさいので他の人に押し付けます。

(参考:2021 アジア地区大会 選抜ルールより引用)

手順1 参加チームについて成績順に以下のルールを適用する.いま,該当チームを A とする.

  1. その時点での選抜チーム数が 10 に満たない場合
    Aは横浜大会の参加チームとして選抜される.
  2. その時点での選抜チーム数が 20 に満たない場合
    Aと同じ大学等の所属でその時点で選抜されたチームの数が 3 に満たなければ,Aは横浜大会の参加チームとして選抜される.
  3. その時点での選抜チーム数が 30 に満たない場合
    Aと同じ大学等の所属でその時点で選抜されたチームの数が 2 に満たなければ,Aは横浜大会の参加チームとして選抜される.
  4. その時点での選抜チーム数が 39 に満たない場合
    Aと同じ大学等の所属でその時点で選抜されたチームがなければ,Aは横浜大会の参加チームとして選抜される.

手順2

  1. 手順1 終了後,ホスト大学のチームで選抜されていない最上位の1チームは,横浜大会実行委員会 が認めた場合,横浜大会の参加チームとして選抜される.

その後、見事 TumoiYorozu さんにやってもらうことに成功し、通過判定についても AC を得ることができました(1 WA した気もするけど)。

国内予選終了後にちょっと通過判定の表示方法を変えたりして、ICPC 2021 国内予選 JSON 部門は終了しました。


まとめ

初心者でもデータをクロールしてきて userscript で順位表に色付けする、くらいならまぁできる。

こういうのはたまにやるとたのしい。