🗻

AtCoder Huristic Contest用のCLIを作ってみた

2024/05/30に公開

はじめに

Golang + Cobraでahc用のCLIを作ってみました。
ahc030、ahc031、先日のahc033でデバッグやってました。これから延長戦をやるには実用的なレベルになったと思うので公開してみます。

https://github.com/ynzwtks/hc

モチベーション

以前、ahcに参加してしばらくの間は自家製シェルでテストケースを回していたのですが、以下のような不満がありました。

  • コンテストの開始後に行うテスト実行環境の設定の煩わしさ
    手組のシェルでやっていると、次のコンテストまでには設定や作りをすっかり忘れてたり…
  • シリアル実行での処理時間の遅さ
    時間制限ぎりぎりまで伸ばしたらテストケース1000件で10分とか…
  • テストケース実行の柔軟性のなさ
    特定のパラメータパターンに絞ってテストができず、テスト全件回さないといけなかったり…
  • スコアの変動の分析ができない
    ざっくりと平均でスコアを算出していたので、スコア改善や悪化の要因を把握できてなかったり…

という反省があり、CLIを作ってみることにしました。
また、個人的には延長戦としてマイペースで復習するのが好きなので、Standingツールを使って改善を確認できるようにもしたい。

コンセプト&実装したもの

下記コンセプトでほぼ当初の不満は解消できたかなーと思います。

  1. 環境設定の簡素化

    • シングルバイナリ構成でインストールはバイナリを配置するだけ
    • 設定はCLIからインタラクティブに
    • テストケースの追加はCLIの実行で完結
      また、システムテストケース、standingツールの設定もCLI実行で設定できるように
  2. テスト実行の高速化

    • Goルーチンでworkerを呼び出して並列化
    • Cloud Run Jobsのジョブをキックできるようにした
      ちなみにCloud Run Jobsはリージョン毎に同時実行50タスクまでという制限ありますが、複数リージョン(香港、ソウル、大阪、シンガポール、マレーシア)にタスクを割り当てることで、250タスク×2cpu = 500cpuで回すことがき、2000件(1ケースあたり約3秒)を1分弱で終わります。ただ、1回あたり80円くらい課金発生します…
  3. テストケースのフィルタリング

    • テストケースの1行目のパラメータでフィルタリングしてテスト実行できるようにした
    • 独自にテストケースのパラメータを定義できるようにした(ahc031の空き領域のように)
  4. 実行途中のスコア表示、ログの差分表示

    • テスト実行中画面に前回と過去ベストとの差を表示するようにした
    • ログ参照時にdiffを表示
  5. Standingツールとの連携

    • ログ参照時にdiff表示と昇順・降順のソート
    • 実行結果のログはスコアだけでなく、点数のランキング、ベストスコア、テストケースのSeed値も表示できるようにした

Discussion