Rime TESTSET
入力生成器 Generator
単にコンパイルして実行されるだけなので,内部で std::ofstream などを使ってファイルに書き出す.その際拡張子は .in にする.
testlibの乱数は怪しいという噂があるらしい(真偽不明)ので適宜乱数生成器を変更しても良いかもしれないが,その際は複数実行してもテストケースが変化しないようにする.シード値表などを作るのがよいのだろうか,やったことがないので何か知っていたら教えてほしい.
以下は N 桁の正の整数を出力するジェネレータの例.
code:cpp
#include "testlib.h"
#include <bits/stdc++.h>
// 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;
}
#ifdef input_style
N S
#endif
入力検証器 Validator
Generator で生成されたテストケースが制約を満たしているかを確認する.
基本的に testlib の機能を用いて制約外の入力・余計な空白などが無いかを確認し,総和が K 以下などの特殊な制約はコードを書いて対応する(例えばこの場合は,実際に総和を求めて assert(MIN_K <= sum and sum <= MAX_K) などとするのが良いかと思う).
入力読み込みは testlib read 系まとめ を参考にして下さい.
上の generator の validator の例.
code:cpp
#include "testlib.h"
#include <bits/stdc++.h>
// 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");
assert(Si != '0');
inf.readEoln();
inf.readEof();
return 0;
}
#ifdef input_style
N S
#endif
出力検証器 Judge
以下のコードを参考にしてください.
WA のときは quitf(_wa, "hogehoge")
AC のときは quitf(_ac, "hogehoge")
よくわからないけど,上のように書かないと動きません.
N 桁の整数が入力されるので同じ整数を出力する問題の judge コード例
code:cpp
#include "testlib.h"
#include <bits/stdc++.h>
// 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
放置
#Rime
#testlib
#作問