如何实现 Arbiter 的 Special Judge 评测任务
博主找了时间研究了 Arbiter 如何评测 SPJ。发现网上几乎没什么资料。
题目配置的比较器改为自定义,将 Linux 下编译好的比较器(不带后缀名的)放在比赛目录的 filter
文件夹内(里面有许多自带的比较器)。
比较器的代码?下面放一份框架
... // 该写啥写啥
int main(int argc, char *argv[]) {
// Arbiter 调用时,argc = 4。
// argv[0] 为 比较器名称
// argv[1] 为 当前测试点输入数据的绝对路径。该文件被复制一份于比赛目录下的 tmp 文件夹里,且只读。选手的代码、编译的程序、这份比较器、输入文件、选手输出均在该文件夹中,答案文件不在其中。
// argv[2] 为 选手输出的绝对路径,指向 tmp 文件夹中的输出
// argv[3] 为 答案文件,指向比赛目录下的 evaldata 中的答案文件
FILE in = fopen(argv[1], "r");
FILE out = fopen(argv[2], "r");
FILE ans = fopen(argv[3], "r");
// 使用 fscanf 读取 in、out、ans 中的信息。如果是构造之类的题,很可能不需要 ans
if (check() == true) {
puts("10"); // AC
puts("Correct Answer!"); // Log
} else {
puts("0"); // WA,0/10 Pt
puts("There's Something Wrong!"); // Log
}
// 根据程序的判断,接着向标准输出中输出两行信息:分数、反馈信息('Accept'、'%d percent correct' 等任何你想写的信息。这里分数满分是十分,Arbiter 会根据测试点分值自动换算得分
}
简单解释就是要传参数,标准输出返回结果。可能两行反馈写反了到时候自己试一试就行了。
Arbiter 更新了,评测过程无法修改 .in
文件了。NOIP2020 的事件应该不会发生了(