Testlib教程·Checker与Lemon评测机的碰撞
Testlib介绍
如果你正在使用 C++ 出一道算法竞赛题目,Testlib 是编写相关程序(generator, validator, checker, interactor)时的优秀辅助工具。它是俄罗斯和其他一些国家的出题人的必备工具,许多比赛也都在用它:ROI、ICPC 区域赛、所有 Codeforces round……
Testlib 库仅有 testlib.h 一个文件,使用时仅需在所编写的程序开头添加 #include "testlib.h"
即可。
Testlib 的具体用途:
编写 Generator,即数据生成器。
编写 Validator,即数据校验器,判断生成数据是否符合题目要求,如数据范围、格式等。
编写 Interactor,即交互器,用于交互题。
编写 Checker,即 Special Judge。
下载地址
By Github:戳这里下载
By Gitee:戳这里下载
By 作者百度网盘:标准版 Lemon评测机定制版
声明:笔者使用的是 Lemon 评测机定制版,下文以笔者使用的版本为准,也建议大家下载Lemon 评测机定制版。
由于 Github 在境内访问性较差,所以特地为读者准备了网盘的下载链接。同时,也给出 Lemon 评测机的下载链接:戳这里下载
配置自定义校验器
下载完成后,点开会看到一个文件名为 testlib.h
的文件,这就是我们的 Testlib 库了。只需要将这个文件复制到 Dev-cpp 的文件夹下(笔者的路径是 C:\Program Files (x86)\Dev-Cpp\MinGW32\include
),就可以在代码中引用了。
自定义校验器写法
先来看一下在各大 OJ 上的 Special Judge 框架写法:
#include"testlib.h"
int main(int argc,char *argv[]) {
registerTestlibCmd(argc,argv);
// 主要代码
if(xxx) quitf(_ok,"xxx");
else quitf(_wa,"xxx");
}
但在 Lemon 评测机上,你要是这么写,你可能会看到一条 校验器运行时错误
,因为 Lemon 评测机的自定义校验器是这么写的:
#include "testlib.h"
int main(int argc, char* argv[]) {
registerLemonChecker(argc, argv);
// 主要代码
if (xxx) quitf(_ok, "xxx");
else quitf(_wa, "xxx");
}
讲完大框架,再来说说里面的一些主要的内容:
状态:
何为状态?状态就是你的代码在评测之后返回的结果。众所周知,算法竞赛中的结果往往有如下几种:AC
、WA
、CE
、RE
,而 Testlib 主要会返回如下结果:
上表摘自 OI Wiki。OI Wiki 中的描述
对象
上表摘自 OI Wiki。OI Wiki 中的描述
常用函数
ouf.readInt() //获取选手的输出
ans.readInt() //获取样例输出
quitf() //返回结果
inf.readEoln() //获取输入文件的下一行
一个实例
#include "testlib.h"
int f(int x) {
if (x >= 0 && x <= 9) return x;
int result = 0;
int tmp = x;
while (tmp) {
result += tmp % 10, tmp /= 10;
}
return f(result);
} //统计各个数位上的数字之和的函数
int main(int argc, char* argv[]) {
registerLemonChecker(argc, argv);
int Yourans = ouf.readInt();
int Myans = ans.readInt();
int t = inf.readInt();
inf.readEoln();
t = inf.readInt();//获取输入文件的第二行
//如果要获取到好多行之后可以使用循环,这里不过多阐述了。
if (f(Yourans) != f(Myans)) {
quitf(_wa, "Your answer is wrong.");
}
else {
quitf(_ok, "Great! Your answer is correct!");
}
}
与 Lemon 的结合使用
配置好文件后,进行编译,将编译后的程序和测试用例用一个文件夹放到比赛目录中的 data
文件夹中,然后在试题详情界面选择 自定义校验器模式
,传入校验器路径即可。
以上就是对 Testlib 的使用介绍,感谢阅读!