OITA: Oika's Information Technological Activities

@oika 情報技術的活動日誌。

AtCoder を C# で戦う環境を整える(.NET Core)

f:id:kd1:20200510130115p:plain

お久しぶりです。元気です。

最近 AtCoder のABCをやりはじめました。数学できなくてつらい。

普通に Visual Studio IDE で ポチポチプロジェクト作って、デバッグ実行して、よしとなったらコピーして提出ページにペーストって感じでやってたんですが、どうやらランクのためにはスピードが大事らしい。それにもっと怠惰にやりたい。
ので、VSCode を使うことにして、コンソールでだいたい完結できる環境を作りましたメモ。
基本的に既存のツールを使わせてもらっただけですが。

環境

  • Windows 10 Home
  • Visual Studio Code
    • C# 拡張入れておく(割愛)
    • 特別 VSCode である必要はないかも
  • .NET Core v3.1
  • Python v3.8.2
    • 下記 online-judge-tools に使用
  • Node.js v12.16
    • 下記 atcoder-cli に使用

利用ツール

  • atcoder-cli
    • npmで入れます npm install -g atcoder-cli
    • コマンドは acc xxx
    • ※後述するが、リポジトリからCloneして入れたほうがいいかも
  • online-judge-tools
    • pipで入れます pip3 install online-judge-tool
    • コマンドは oj xxx

上記のツールを入れたらだいたい終わり。詳細はそれぞれのページを参照。
あとは細かい設定等の調整です。

各種設定

ログイン

acc loginoj login https://atcoder.jp/ をしておく必要あり。
それぞれチュートリアルページに書いているとおりですね。

oj のほうは Selenium がないよっていう警告が出るが、cli からユーザ・パスを直打ちする分には問題なし。

自動で全問題のテストケースをダウンロードさせる

デフォルトでは、 acc new acc add したときに、A-F どの問題のテストケースをダウンロードするか選択するようになっているが、めんどくさいので最初に全部落とすようにデフォルト設定してしまう。

$ acc confg default-task-choice all

テストディレクトリ名変更

acc newacc add のときに自動生成されるテストケースフォルダ名は tests になっているが、これだと online-judge-tool のほうで認識できないっぽい。

oj t コマンドで認識できるように、グローバル設定でフォルダ名を tests から test に変更する。

$ acc config default-test-dirname-format test

テンプレートの作成

.NET Core のプロジェクトは dotnet new console などのコマンドで作成するが、毎回これをやらなくていいように&よく使うUtilコードとかセットで準備できるようにテンプレート化しておく。

acc config-dir で設定ファイルの場所を確認できる。
C:\Users\[ユーザ名]\AppData\Roaming\atcoder-cli-nodejs\Config になっているかと思います。

ここに cs フォルダを作成。

この中に、適当なプロジェクト名のプロジェクトファイルをあらかじめ配備しておく。
最低限、以下2つがあればいい。

x.config

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>
</Project>

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;

namespace x
{
    class Program
    {
        static void Main(string[] args)
        {

        }
    }

    //よく使うコードなどあれば    
    class Utils
    {
        ...
    }
}

今後いろいろ使いたい自前ライブラリが増えてきたら、どうするのがいいんだろうな。
ファイルを増やすと提出がめんどくさくなるので、とりあえず実行は Program.cs 1ファイルで完結するようにしておく。

同じフォルダ内に template.json を作成

{
  "task": {
    "program":["Program.cs", "x.csproj"],
    "submit": "Program.cs"
  }
}

program に記載されたファイルが、 acc new コマンドで自動展開される。
submit のほうが、提出されるファイル。

テスト実行コマンドのエイリアス作成

online-judge-tool のテスト実行機能では、 C++以外で実行するときは oj t -c "dotnet run" のように、テスト実行のコマンドを指定してやる必要がある。

毎回これをやるのはつらいので、簡易コマンドを用意しておく。

何を使ってもいいんだけど、node が入ってるので npm でやることもできる。
以下のpackage.json を作っておいて

{
  "name": "x",
  "private":true,
  "scripts": {
    "test": "oj t -c \"dotnet run\""
  }
}

npm run test で実行できる。

この package.json も毎回コピーされるように、template.json に追加しておく。

{
  "task": {
    "program":["Program.cs", "x.csproj", "package.json"],
    "submit": "Program.cs"
  }
}

あとはこの cs フォルダ内のテンプレートが自動で利用されるように、 acc の設定に追加。

$ acc config default-template cs

言語選択

以前まで、C# のコードは AtCoder では Mono 4.6.2 のみで実行されていたので、過去の問題については、C# のコードを提出すれば勝手に Mono 4.6.2 で実行・評価してもらうことができる。

しかし最近、C# 実行環境の選択肢が増えたため、明示的に指定しないとエラーになるようになってしまった。

[ERROR] Matched languages were not narrowed down to one.
[*] You have to choose:
4010 (C# (.NET Core 3.1.201))
4011 (C# (Mono-mcs 6.8.0.105))
4012 (C# (Mono-csc 3.5.0))

online-judge-tool のほうではこれを指定する --language オプションがあるのだけど、困ったことに atcoder-cli にはこのオプションがない。

と思って、ツールのリポジトリ を覗いてみたら、どうやらすでに acc から oj にオプションを引き継いで渡す機能がコミットされている様子。

リリースが待ちきれないので、developブランチをクローンしてきて使わせていただくことにします。

$ npm rm -g atcoder-cli   # 入れていたやつを一度削除
$ git clone https://github.com/Tatamo/atcoder-cli.git
$ cd atcoder-cli/
$ npm i        # パッケージのビルド
$ npm i -g ./  # ローカルファイルからインストール

手元でやったときは config ファイルはそのまま残っていたが、一応入れなおすときは退避しておいたほうがいいかも。

これで、以下のようにコマンド実行すれば提出できるようになった。

$ acc submit -s -- -l 4010
  • -s は、template.json で提出ファイル名を定義してるからここでは指定しないよの意
  • -l .NET Core を指定するなら 4010

このオプションも毎回指定するのはつらいので、test と同じく npm で実行することにする。

package.json

{
  "name": "x",
  "private":true,
  "scripts": {
    "test": "oj t -c \"dotnet run\"",
    "submit": "acc submit -s -- -l 4010"
  }
}

なお、submitを実行したときに oj のほうから、オペミスっぽいぞと警告が出て「abca」とか確認タイプさせられてしまうんだけど、まあこれはよしとするか。実際の確認の意味もこめて。

作業フロー

AtCoder Beginner Contest 166 をやる場合、

  • acc new abc166 → abc166 フォルダが作られ、その中に a - f フォルダができる
  • 実際の問題はブラウザからウェブページで確認
  • A問題を解く場合、a フォルダ内の Program.cs でコーディング
    • cd abc166/a/
  • npm run test でテスト実行
  • npm run submit で提出
    • ブラウザで提出ページが開くので、結果を確認

以上。