Rime TESTSET
入力生成器 Generator
単にコンパイルして実行されるだけなので,内部で std::ofstream などを使ってファイルに書き出す.その際拡張子は .in にする.
testlibの乱数は怪しいという噂があるらしい(真偽不明)ので適宜乱数生成器を変更しても良いかもしれないが,その際は複数実行してもテストケースが変化しないようにする.シード値表などを作るのがよいのだろうか,やったことがないので何か知っていたら教えてほしい.
以下は N 桁の正の整数を出力するジェネレータの例.
code:cpp
// constraints
const int MIN_N = 1;
const int MAX_N = 100000;
void gen(int id) {
std::ofstream of(format("001_small_rnd_%02d.in", id).c_str());
const int N = rnd.next(MIN_N, MAX_N);
std::string S(N, '.');
for(int i = 0; i < N; i++) {
if(i == 0) Si = (char)('0' + rnd.next(1, 9)); else Si = (char)('0' + rnd.next(0, 9)); }
// 出力
of << N << " " << S << std::endl;
of.close();
}
int main(int argc, char* argv[]) {
registerGen(argc, argv, 1);
// 10 ケース生成
for(int i = 1; i <= 10; i++) gen(i);
return 0;
}
N S
入力検証器 Validator
Generator で生成されたテストケースが制約を満たしているかを確認する.
基本的に testlib の機能を用いて制約外の入力・余計な空白などが無いかを確認し,総和が K 以下などの特殊な制約はコードを書いて対応する(例えばこの場合は,実際に総和を求めて assert(MIN_K <= sum and sum <= MAX_K) などとするのが良いかと思う).
上の generator の validator の例.
code:cpp
// constraints
const int MIN_N = 1;
const int MAX_N = 100000;
int main(int argc, char* argv[]) {
registerValidation(argc, argv);
int N = inf.readInt(MIN_N, MAX_N, "N");
inf.readSpace();
std::string S = inf.readToken(format("0-9{%d, %d}", MIN_N, MAX_N), "S"); inf.readEoln();
inf.readEof();
return 0;
}
N S
出力検証器 Judge
以下のコードを参考にしてください.
WA のときは quitf(_wa, "hogehoge")
AC のときは quitf(_ac, "hogehoge")
よくわからないけど,上のように書かないと動きません.
N 桁の整数が入力されるので同じ整数を出力する問題の judge コード例
code:cpp
// constraints
const int MIN_N = 1;
const int MAX_N = 100000;
int main(int argc, char* argv[]) {
// inf: 入力
// ans: diff
// ouf: 出力
// 以上がそれぞれに入るが基本 inf/ouf を用いることになると思う.
registerTestlibCmd(argc, argv);
// 入力ファイルから整数を読み取り
std::string S = inf.readToken(format("0-9{%d, %d}", MIN_N, MAX_N)); // 解答コードの出力から整数を読み取り
std::string ans = ouf.readToken(format("0-9{%d, %d}", MIN_N, MAX_N)); if(S != ans) quitf(_wa, "wa");
else quitf(_ok, "ok");
return 0;
}
リアクティブ Reactive
放置
部分点 Subtask
放置