最强的对拍
作者:互联网
点击查看代码
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <iostream>
#include <sstream>
#include <stack>
#include <cmath>
#include <algorithm>
#include <map>
#include <queue>
#include <list>
#include <string>
#include <cstring>
#include <chrono>
using namespace std;
using namespace chrono;
string arg[10];
bool sys(string cmd)
{
if (system(cmd.c_str()))
{
return 0;
}
return 1;
}
bool Compile(string filename)
{
puts("--------------");
if (!sys("g++ " + filename + ".cpp -o " + filename + " -O2 -Wall -Wno-unused-result -DDEBUG -fsanitize=address,undefined"))
{
return 0;
}
puts("Done");
puts("--------------");
return 1;
}
int main(int argv, char **argc)
{
for (int i = 1; i < argv; ++i)
{
arg[i] = argc[i];
}
puts("--------------");
printf("cpp: %s\n", arg[1].c_str());
printf("std: %s\n", arg[2].c_str());
printf("rand: %s\n", arg[3].c_str());
if (arg[4] == "no")
{
puts("Disable compile");
}
else
{
puts("Enable compile");
}
if (arg[5] != "")
{
printf("Testcases: %d\n", stoi(arg[5]));
}
puts("--------------");
if (arg[4] != "no")
{
puts("Compile cpp");
if (!Compile(arg[1]))
{
return 0;
}
puts("Compile std");
if (!Compile(arg[2]))
{
return 0;
}
puts("Compile rand");
if (!Compile(arg[3]))
{
return 0;
}
}
int n = -1;
if (arg[5] != "")
{
n = stoi(arg[5]);
}
puts("Now begin test");
puts("--------------");
steady_clock::time_point t1, t2;
duration<double> ut;
for (int i = 1; i != (n + 1); ++i)
{
printf("Testcase %d\n", i);
if (!sys("./" + arg[3] + " > duipai_rand.in"))
{
puts("Rand runtime error");
return 1;
}
t1 = steady_clock::now();
if (!sys("./" + arg[1] + " < duipai_rand.in > duipai_cpp_out.out"))
{
puts("Cpp runtime error");
return 1;
}
t2 = steady_clock::now();
ut = duration_cast<duration<double>> (t2 - t1);
printf("Cpp used time: %.3lf ms\n", ut.count() * 1000);
t1 = steady_clock::now();
if (!sys("./" + arg[2] + " < duipai_rand.in > duipai_std_out.out"))
{
puts("Std runtime error");
return 1;
}
t2 = steady_clock::now();
ut = duration_cast<duration<double>> (t2 - t1);
printf("Std used time: %.3lf ms\n", ut.count() * 1000);
if (!sys("diff duipai_cpp_out.out duipai_std_out.out > diff.log"))
{
puts("Wrong Answer");
return 1;
}
puts("--------------");
}
}
环境:linux
用法:先编译,假设编译出来的文件名为 duipai
在终端内输入 ./duipai [你的代码文件名(去掉.cpp)] [标程代码文件名(去掉.cpp)] [随机数据生成器代码文件名(去掉.cpp)] [是否需要重新编译这三个文件,不需要填 no,需要任填或不填] [对拍次数]
实例:
需对拍的代码:(a.cpp)
点击查看代码
#include <cstdio>
#include <cstdlib>
#include <ctime>
int main()
{
int a, b;
scanf("%d%d", &a, &b);
// 如需测试程序运行时间功能,请取消注释这里
// #include <unistd.h>
// usleep(10000); // 让程序暂停多少微秒
// 如需测试判断 WA 功能,请取消注释这里,该程序则会有 30% 的概率 WA
// srand(time(0));
// if (rand() % 10 <= 2)
// {
// puts("sb");
// }
// 如需测试判断 RE 功能,请取消注释这里,该程序则会有 30% 概率 RE
// srand(time(0));
// if (rand() % 10 <= 2)
// {
// printf("%d", 1 / 0);
// }
printf("%d\n", a + b);
}
标程:(std.cpp)
点击查看代码
#include <cstdio>
#include <cstdlib>
int main()
{
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", a + b);
}
数据生成器 :(rand.cpp)
点击查看代码
#include <cstdio>
#include <cstdlib>
#include <ctime>
int main()
{
srand(time(0));
printf("%d %d\n", rand() % 100000, rand() % 100000);
}
使用指令:
./duipai a std rand
正常编译这三个代码,然后跑对拍
./duipai a std rand no
不编译,用上次编译出的程序对拍
./duipai a std rand 随便填 100
编译,对拍100次
./duipai a std rand no 100
不编译,对拍100次
标签:rand,return,puts,duipai,arg,最强,include 来源: https://www.cnblogs.com/eafoo/p/16388076.html