UOJ Logo poorpool的博客

博客

怎样写 validator 和 checker

2018-04-03 20:05:43 By poorpool

当一个问题有多种合法解的时候,我们需要 spj 来判定选手的程序是否正确。比如说,让你输出“poorpool 太菜了”的同义句,你既可以输出“poorpool 是蒟蒻”,也可以输出“poorpool 啥都不会”。单纯的文件比较显然无法胜任评测的需要。

LFYZOJ 使用的 UOJ 采用 Codeforces 的 testlib.h 作为 checker、validator(判断 hack 数据是否合法的程序)的工具。

cf链接

loj链接

uoj文档

uoj部署指北

validator 示例(#13. 排序):

#include <iostream>
#include <cstdio>
#include "testlib.h"
int main(int argc, char* argv[]){
    registerValidation();
    int n=inf.readInt(1, 2808417);
    inf.readEoln();
    for(int i=1; i<=n; i++){
        inf.readInt(-1000000000, 1000000000);
        if(i<=n-1)
            inf.readSpace();
    }
    inf.readEof();
    return 0;
}

checker 示例(#30. 四素数之和):

#include "testlib.h"
#include <cstdio>
#include <iostream>
using namespace std;
int n[55], m[55];
bool vis[10000005];
void shai(){
    memset(vis, true, sizeof(vis));
    vis[0] = vis[1] = false;
    for(int i=2; i<=10000000; i++){
        for(int j=i+i; j<=10000000; j+=i)
            vis[j] = false;
    }
}
int main(int argc, char *argv[]){
    registerTestlibCmd(argc, argv);
    shai();
    int tmp;
    while(tmp=inf.readInt()){
        if(!tmp)break;
        for(int i=1; i<=4; i++)    n[i] = ans.readInt();
        for(int i=1; i<=4; i++)    m[i] = ouf.readInt(0, 10000000);
        if(n[1]+n[2]+n[3]+n[4]!=m[1]+m[2]+m[3]+m[4])
            quitf(_wa, "sum != n.");
        if(n[1]+n[2]+n[3]+n[4]!=0)
            if(!(vis[m[1]] && vis[m[2]] && vis[m[3]] && vis[m[4]]))
                quitf(_wa, "not prime.");
    }
    quitf(_ok, "Congratulations!");
}

评论

NaCl
%%%
luv_letters
%%%
sdw
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。