如何实现 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 的事件应该不会发生了(

posted @ 2021-11-14 00:17  AC-Evil  阅读(292)  评论(1编辑  收藏  举报