競プロの作問ヘルパーツールを作りました.
特徴
go実装なのでgoの環境があれば多分動く(windowsでしか検証してない).テストと問題の管理をするというのが目標で,綺麗に整形するとかは目指していない.(2015/8/16/1:26追記)
導入方法
- goの環境を作ります
-
go get -u github.com/camypaper/spica
とgo get -u github.com/camypaper/virgo
します - 環境変数に
LIBRAPATH
を作ってそこにconfig.tomlを置きます.
プログラムのコンパイルや実行用の設定ファイルです
設定
config.tomlをいじってください.spicaとvirgoのどちらでも使われます.
#コンパイルや入力生成器の許容実行時間(sec)
timelimit=120.0
#言語ごとに以下のものを書けば良いです.
[[language]]
#言語名,書かなくても良い.
name="CSharp"
#拡張子.必須.
ext=".cs"
#コンパイル時に実行するコマンド.
compile="mcs /r:System.Numerics.dll -out:$OUT$ $SRC$"
#実行するためのコマンド.
execute="mono $OUT$"
#何個も書けますが,拡張子が重複しないようにしてください.
[[language]]
name="CPP"
ext=".cpp"
compile="g++ -O2 -lm -std=gnu++11 -o $OUT$ $SRC$"
execute="$OUT$"
#Javaも使えるはず(2015/8/17/21:35)
[[language]]
name="Java"
ext=".java"
compile="javac -encoding UTF8 -d $OUTDIR$ $SRC$"
execute="java -classpath $OUTDIR$ $SRCNAME$"
$SRC$
はソースコードのパスに,$OUT$
は実行ファイルのパスで実行時に置換されます.
$SRCNAME$
と$OUTDIR$
を追加しました.それぞれ,ソースコード名と実行ファイルがあるディレクトリへのパスで置換されます.(2015/8/17/21:08)
spica
ある一問の問題に対して入力生成,入力検証,出力生成,想定解以外のテストができます.
基本的にはyosupoくんのSOJと同じ設計になっています.
使い方
problem.tomlにテスト用の設定を書く必要があります.パスはproblem.tomlがあるところからの相対パスで記入してください.
name="A + B" #問題名
timelimit=1.0 #テストの実行時間制限
checker="" #スペシャルジャッジ用のチェッカー
solution="solution.cpp" #想定解
validator="validator.cs" #入力検証器
[[answer]] #想定解以外のソースコード
path="wrong_answer.cs"
[[generator]] #入力生成器
path="generator.cs"
count=4 #ケース数
コマンド
- init
- test
の2つのコマンドがあります
init
spica init
するとproblem.tomlが実行したディレクトリに生成されます.
今のところテンプレートなどは指定できませんが,そのうちできるようにするかもしれません.
test
spica test
するとproblem.tomlに書かれた設定を下にテストが走ります.
今のところ--json
と-j
の2つのオプションがあり.つけると出力されるログのフォーマットがjsonになります.
他にも--concurrent
,-c
,--debug
,-d
のオプションができました。前の2つは並行テスト,後ろの2つはデバッグメッセージの出力ができます.
(2015/8/25/14:56追記)
入力生成器の仕様
設定ファイルで指定したcount回実行が行われます.標準入力に1~countまでの整数が与えられるので標準出力にテストケースを出力してください.
count=-1にすると,実行だけ行われます.自分でファイル生成したいときに使ってください.(2015/8/17/18:07追記)
入力検証器の仕様
標準入力にテストケースが与えられます.exit(0)
したものだけがパスしたものとして扱われます.
想定解,その他の回答の仕様
標準入力にテストケースが与えられます.標準出力に答えを出力してください.
出力検証器の仕様
checkerが""の場合にはdiffを取ります.それ以外の場合は出力検証器をコンパイル実行します.
~~標準入力に,その他の回答の出力が,~~実行引数の1番目にテストケースの入力ファイルへのパスが,2番目にプログラムの出力ファイルへのパスが,23番目に想定解の出力ファイルへのパスが与えられます.(2015/8/17/18:07追記)
virgo
spicaを複数問題用にしたものです.コンテストとかの問題をまとめてテストする前提で作られています.
コマンド
- init
- add
- rm
- test
init
virgo init
するとcontest.tomlが生成されます.ここに各問題へのパスが記述されます.このファイルは基本的に人間がいじる必要はありません.
add
virgo add 問題名
するとcontest.tomlにその問題が追加されます.さらに問題名のディレクトリとproblem.tomlを生成します.problem.tomlが存在する場合にはスキップします.
virgo add A B C
とするとA,B,Cというディレクトリとそれぞれのディレクトリにproblem.tomlが生成されます.
rm
virgo rm 問題名
するとcontest.tomlからその問題が削除されます.問題のディレクトリなどは消えません.
virgo rm A B C
とするとA,B,Cという問題がcontest.tomlから取り除かれますが,ディレクトリはそのまま残ります.
test
virgo test
するとcontest.tomlに含まれる全ての問題がテストされます.
virgo test A C
とするとAとCの2つの問題だけがテストされます.
オプションは--json
と-j
の2つがあり,出力されるログがjsonフォーマットになります.
こちらにも--concurrent
,-c
,--debug
,-d
のオプションができました。前の2つは並行テスト,後ろの2つはデバッグメッセージの出力ができます.
(2015/8/25/14:56追記)
今後の実装予定
まだあんまり考えていませんが,各テストケースごとにACしたのかWAしたのかとかの結果を吐くようにしようと考えています