其他分享
首页 > 其他分享> > 对拍&数据生成器

对拍&数据生成器

作者:互联网

1. 对拍

鸣谢 $\color{black}{E}\color{red}{afoo}$ 的拍!

然后我重写了一版功能更丰富的(

使用说明:

适用环境:Linux C++程序的对拍

首先输入

g++ duipai.cpp -o duipai

然后输入

./duipai your_code std_code data_generator compile_again testcases time_limit

不是直接输入上面的东西,上面每个参数都有意义:

$\qquad$ $your\_code$ $\to$ 一个字符串,表示你的程序名(不加.cpp后缀)

$\qquad$ $std\_code$ $\to$ 一个字符串,表示标程的程序名(不加.cpp后缀)

$\qquad$ $data\_generator$ $\to$ 一个字符串,表示数据生成器的程序名(不加.cpp后缀)

$\qquad$ $compile\_again$ $\to$ 一个字符串,表示是否重新编译(输入 $no$ 表示否定,别的什么东西表示肯定)(个人建议让它重新编译)

$\qquad$ $testcases$  $\to$ 一个数字,表示总数据点个数(输入小于等于 $0$ 的数字会无限评测)

$\qquad$ $time\_limit$ $\to$ 一个数字,表示时间限制(用毫秒表示)

比如如果你的程序叫 $A.cpp$ ,标程叫 $A-std.cpp$ ,数据生成器叫 $getdata$ ,想要重新编译,无限数据点,时限 $1s$

那么你可以输入

./duipai A A-std getdata yes 0 1000

具体功能:

  1. 对拍(
  2. 输出 $RE$ 的错误信息(数组越界或是别的什么,而不是只有一个 $Segmentation\; fault$ )
  3. 每隔 $100$ 个测试点输出平均耗时和最大耗时
  4. 是否 $TLE$
#include<bits/stdc++.h>
#include<chrono>
using namespace std;
using namespace chrono;
string str[10];
int time_limit;
double tot_cpp,tot_std,maxx_cst;
bool sys(string cmd){
    if(system(cmd.c_str())) return false;
    else return true;
}
bool Compile(string filename){
    printf("---------------------------\n");
    if(!sys("g++ "+filename+".cpp -o "+filename+" -O2 -Wall -Wno-unused-result -DDEBUG -fsanitize=address,undefined")) return false;
    printf("Compiled Successfully\n");
    printf("---------------------------\n");
    return true;
}
void print_average_time(int x){
    printf("---------------------------\n");
    printf("Accepeted %d testcases\n",x);
    printf("Average data:\n");
    printf("You cost       %.3lf ms\n",tot_cpp/x);
    printf("Standard cost  %.3lf ms\n",tot_std/x);
    printf("Max time cost  %.3lf ms\n",maxx_cst);
    printf("---------------------------\n");
}
int main(int argv,char **argc){
    for(int i=1;i<argv;i++) str[i]=argc[i];
    printf("---------------------------\n");
    printf("Your code: %s.cpp\n",str[1].c_str());
    printf("Standard code: %s.cpp\n",str[2].c_str());
    printf("Data generator: %s.cpp\n",str[3].c_str());
    if(str[4]=="no"||str[4]=="No"||str[4]=="NO") printf("Disable auto-compile\n");
    else printf("Enable auto-compile\n");
    if(str[5]!=""&&stoi(str[5])>0) printf("Total testcases: %d\n",stoi(str[5]));
    else printf("Infinate testcases\n");
    if(str[6]!="") printf("Time limit: %d\n",stoi(str[6]));
    else printf("No time limit\n");
    printf("---------------------------\n");
    if(str[4]!="no"&&str[4]!="No"&&str[4]!="NO"){
        printf("Compiling your code...\n");
        if(!Compile(str[1])) return 0;
        printf("Compiling standard code...\n");
        if(!Compile(str[2])) return 0;
        printf("Compiling data generator...\n");
        if(!Compile(str[3])) return 0;
    }
    int n=-1;
    if(str[5]!=""&&stoi(str[5])>0) n=stoi(str[5]);
    if(str[6]!="") time_limit=stoi(str[6]);
    else time_limit=0;
    printf("Now begin test\n");
    printf("---------------------------\n");
    steady_clock::time_point t1,t2;
    duration<double>ut;
    for(int i=1;i!=(n+1);i++){
        if((i-1)%100==0&&i!=1){
            print_average_time(i-1);
            printf("---------------------------\n");
        }
        printf("Testcase %d\n",i);
        if(!sys("./"+str[3]+" >duipai_rand.in")){
            printf("Data generator RE\n");
            return 1;
        }
        t1=steady_clock::now();
        if(!sys("./"+str[1]+" <duipai_rand.in >duipai_cpp.out")){
            printf("Your code RE\n");
            return 1;
        }
        t2=steady_clock::now();
        ut=duration_cast<duration<double> >(t2-t1);
        double tmp=ut.count()*1000;
        printf("You cost       %.3lf ms\n",tmp);
        if(tmp>(double)time_limit&&time_limit!=0){
            printf("Your code TLE\n");
            print_average_time(i-1);
            return 1;
        }
        maxx_cst=max(maxx_cst,tmp);tot_cpp+=tmp;
        t1=steady_clock::now();
        if(!sys("./"+str[2]+" <duipai_rand.in >duipai_std.out")){
            printf("Standard code RE\n");
            return 1;
        }
        t2=steady_clock::now();
        ut=duration_cast<duration<double> >(t2-t1);
        tmp=ut.count()*1000;tot_std+=tmp;
        printf("Standard cost  %.3lf ms\n",tmp);
        if(!sys("diff duipai_cpp.out duipai_std.out >diff.log")){
            printf("Wrong Answer\n");
            return 1;
        }
        printf("Accpeted testcase %d\n",i);
        printf("---------------------------\n");
    }
    print_average_time(n);
    printf("---------------------------\n");
    printf("Finished.\n");
    return 0;
}

 

2. 数据生成器

依旧 Linux 适用,C++版本

#include<bits/stdc++.h>
#include<sys/time.h>
#include<unistd.h>
#define int long long
using namespace std;
int rand(int l,int r){
    return l+(rand()%(r-l+1))*(rand()%(r-l+1))%(r-l+1);
}
signed main(){
    struct timeval time;
    gettimeofday(&time,0);
    srand((unsigned int)time.tv_usec);
    //这里写数据生成器
    for(int i=1;i<=100;i++){
        printf("%lld ",rand(1,100));
    }
    return 0;
}

 

标签:return,int,printf,生成器,str,time,cpp,数据
来源: https://www.cnblogs.com/WintersRain/p/16687916.html