Windows系统对拍程序,其中包含c++11用法,请使用c++11标准编译。此对拍程序会在发现错误时显示错误行号以及对应内容,方便比对。

此对拍程序自动使用g++对源代码进行编译。如果出现找不到g++的错误,请将g++所在目录添加至系统的环境变量列表中;

也可直接注释掉主函数前几行不用自动编译,并将编译好的pai_data.exe(生成数据)、pai_user.exe(用户程序)、pai_std.exe(标准解答程序)放至与本程序所在同目录下。

准备就绪后编译并运行本程序即可。

UPD 2019-04-10:添加了对标程的计时。

UPD 2019-04-18:修复当文件尾没有换行时会导致错误判断的问题。

 #include <cerrno>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime> // 设置区
namespace Settings {
const int MAX_LEN = ; // 发现错误时,显示错误行数据的最大长度
const int CASE_CNT = ; // 对拍测试次数
const int BUFFER_SIZE = << ; // 每行的缓冲区大小
const char *const dataFile = "data.cpp"; // 随机生成数据的源代码文件名
const char *const userFile = "user.cpp"; // 需要测试的源代码文件名
const char *const stdFile = "std.cpp"; // 标准答案的源代码文件名
const char *const dataExeName = "pai_data.exe";
const char *const userExeName = "pai_user.exe";
const char *const stdExeName = "pai_std.exe";
const char *const dataOutputName = "pai_data.txt";
const char *const userOutputName = "pai_user.txt";
const char *const stdOutputName = "pai_std.txt";
} // namespace Settings using namespace Settings;
using namespace std; char cmd[BUFFER_SIZE], info[BUFFER_SIZE * ];
char buf1[BUFFER_SIZE], buf2[BUFFER_SIZE]; template <typename... T>
int run(const char *str, T... args) {
sprintf(cmd, str, args...);
return system(cmd);
} bool fileCompare(const char *stdOutput, const char *userOutput) {
FILE *fp_std = fopen(stdOutput, "r"), *fp_user = fopen(userOutput, "r");
if (fp_std == nullptr || fp_user == nullptr) {
sprintf(info, "Open file failed: %s\n", strerror(errno));
return false;
}
bool flag = true;
for (int i = ; !feof(fp_std) && !feof(fp_user); ++i) {
char *p1 = fgets(buf1, BUFFER_SIZE, fp_std);
char *p2 = fgets(buf2, BUFFER_SIZE, fp_user);
if (p1 == nullptr && p2 == nullptr) {
flag = true;
break;
} else {
int len1 = p1 ? strlen(p1) : -, len2 = p2 ? strlen(p2) : -;
if (p1 && p1[len1 - ] == '\n') p1[len1 - ] = , --len1;
if (p2 && p2[len2 - ] == '\n') p2[len2 - ] = , --len2;
if (p1 == nullptr || p2 == nullptr || len1 != len2 ||
strcmp(p1, p2)) {
if (len1 > MAX_LEN)
sprintf(p1 + MAX_LEN, "... (%d characters omitted)",
len1 - MAX_LEN);
if (len2 > MAX_LEN)
sprintf(p2 + MAX_LEN, "... (%d characters omitted)",
len2 - MAX_LEN);
sprintf(info,
"Difference found in line %d:\n std: %s\n user: %s\n",
i, p1 ? p1 : "(EOF Detected)",
p2 ? p2 : "(EOF Detected)");
flag = false;
break;
}
}
}
fclose(fp_std), fclose(fp_user);
return flag;
} int main() {
int totaltimeCnt = ;
printf("Compiling... ");
if (run("g++ %s -o %s", userFile, userExeName) ||
run("g++ %s -o %s", stdFile, stdExeName) ||
run("g++ %s -o %s", dataFile, dataExeName)) {
puts("Compile failed.");
printf("Press ENTER to exit.\n");
getchar();
return ;
} puts("Finished.");
clock_t stUser, edUser, stStd, edStd;
bool Accepted = true;
for (int i = , ret; i <= CASE_CNT; ++i) {
printf("Case %03d: ", i);
run("%s >%s", dataExeName, dataOutputName); // run std solution
stStd = clock();
ret = run("%s <%s >%s", stdExeName, dataOutputName, stdOutputName);
edStd = clock();
if (ret) {
printf("Non Zero Exit Code: Std solution returned value %d\n", ret);
Accepted = false;
break;
} // run user's solution
stUser = clock();
ret = run("%s <%s >%s", userExeName, dataOutputName, userOutputName);
edUser = clock();
if (ret) {
printf("Non Zero Exit Code: User's solution returned value %d\n",
ret);
Accepted = false;
break;
} if (!fileCompare(stdOutputName, userOutputName)) {
printf("Wrong answer.\n------------------------------\n");
printf("%s", info);
printf("------------------------------\n");
Accepted = false;
break;
} printf("Accepted. StdTime:%4d ms, UserTime:%4d ms\n",
int(edStd - stStd), int(edUser - stUser));
totaltimeCnt += int(edUser - stUser);
}
if (Accepted) {
printf("\nUser's solution got accepted after %d tests.\n", CASE_CNT);
printf("Average time spent: %.2f ms.\n",
double(totaltimeCnt) / CASE_CNT);
}
printf("Press ENTER to exit.\n");
getchar();
return ;
}

Windows系统对拍程序的更多相关文章

  1. [转]Linux/Windows下脚本对拍程序

    [新]简单写法 (转载自:https://blog.csdn.net/ylsoi/article/details/79824655) 要求:文件输入输出,且输入输出文件需要对应 Linux: #inc ...

  2. 手把手教你写对拍程序(PASCAL)

    谁适合看这篇文章? ACMERS,OIERS或其它参加算法竞赛或需要算法的人 对操作系统并不太熟悉的人 不会写对拍的人 在网上找不到一个特别详细的对拍样例的人 不嫌弃我写的太低幼的人 前言 在NOIP ...

  3. 制造测试数据的程序及对拍程序概述(Like CyaRon)

    作为一名OIer,比赛时,对拍是必须的 不对拍,有时可以悔恨终身 首先,对拍的程序 一个是要交的程序 另一个可以是暴力.搜索等,可以比较慢,但是必须正确 下面是C++版对拍程序(C++ & c ...

  4. [zt]手把手教你写对拍程序(PASCAL)

    谁适合看这篇文章? ACMERS,OIERS或其它参加算法竞赛或需要算法的人 对操作系统并不太熟悉的人 不会写对拍的人 在网上找不到一个特别详细的对拍样例的人 不嫌弃我写的太低幼的人 前言 在NOIP ...

  5. 对拍程序 x

    一.介绍 在做题或者正式比赛过程中总会把水题做水做乱,但因为样例有坑所以直接过了样例,然后拿去评测结果发现全WA.那如何在这种情况下检查自己程序或算法的正确性呢?对拍是一个简便省事的方案. 所谓“对拍 ...

  6. 使用Prism6 建立 Windows 10 通用程序.

    使用Prism6 建立 Windows 10 通用程序. 目标: 使用prism6,建立Windows 通用程序项目. 1, 解决方案—添加新建项目—通用—空白应用—输入名称—确定—确定 2 ,引用上 ...

  7. 需要正确安装 Microsoft.Windows.ShellExperienceHost 和 "Microsoft.Windows.Cortana" 应用程序。

    windows 10 开始菜单修复工具 Win10开始菜单修复工具出现的原因,自从升级到Windows  10,一直BUG不断,而其中有一个BUG非常的让你印象深刻,就是开始菜单无响应,你用着用着电脑 ...

  8. windows中的程序放在linux上因为字符集不同出错

    问题 在把windows下的一个python脚本挪到linux下的时候,出现了一个奇怪的问题,就是标题那样的报错,很明显,shell没有用对应的python解释器去解释脚本,而是直接用shell解释了 ...

  9. Mac OS下编写对拍程序

    介绍 对拍是信息学竞赛中重要的技巧,它通过一个效率低下但正确率可以保证的程序,利用庞大的随机生成数据来验证我们的高级算法程序.对拍最大的优势在于可以通过人力所不能及的速度和数量达到验证的效果.下面我们 ...

随机推荐

  1. Jetty配置虚拟目录,实现把web项目发布到自定义目录,指定指定上下文访问;jetty编码修改

    2019-12-31     17:28:38 一般只需要把Java站点文件夹或*.war文件拷贝到Web Server的webapps文件夹下,即可启动运行该站点,但更多时候,我们并不想拷贝站点,而 ...

  2. vue 注意

    Path Intellisense 插件 @路径提醒 配置文件中配置: "path-intellisense.mappings": { "@": "$ ...

  3. go 函数传递结构体

    我定义了一个结构体,想要在函数中改变结构体的值,记录一下,以防忘记 ep: type Matrix struct{ rowlen int columnlen int list []int } 这是一个 ...

  4. JVM第二篇 类加载子系统

    1.内存结构概述 简图 ​ 详细 ​ ​ ​ 2.类加载器与类加载的过程 ​ 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识[CA FE BA BY ...

  5. 题解【CF1311F Moving Points】

    \[ \texttt{Preface} \] 赛时,把 " 任意时刻 " 理解成 " 整数时刻 " 了,看起来一脸不可做的亚子,还各种推式子. 话说我为什么觉得 ...

  6. TCP与UDP的一些心得

    1:CC攻击是正常的业务逻辑,大并发让你处理不过来,处理XP SP2,以上的系统都封了RAW格式协议封包自定义,除了基于应用层改协议,之外都是模拟或请求来测试传输层2:UDP不会粘包,不会少包,除非缓 ...

  7. Android显示单元--像素、分辨率、颜色

    1.像素 老子曾说“天下难事必作于易,天下大事必作于细”,Android开发也是一样,再复杂的App也无非就是数百万个像素点的排列组合.像素虽然看似简单,但是里面大有学问.如果在开发时对像素单位不以为 ...

  8. 软件分享大会之Bonny使用感想

    近日大一期末临近,处在计算机大类专业的我也即将面临专业分流.在软件工程这个新的开始前,未来的系主任组织了一次软件分享会,通过大二.大三学生向大一的我们的作品展示,提前让我们了解自制软件如现流行软件的不 ...

  9. hdu 1257 最少拦截系统 (最长上升子序列/贪心)

    题意:某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭 ...

  10. MS SQLServer相关自动化程序的问题汇总 (SQLServer每天定时输出EXCEL或xml的格式的问题等 )

    · MS SQLServer相关问题 1. 使用MS SQLServer每天定时输出EXCEL格式的文件,实现每天的Excel报表导出 2. 使用MS SQLServer每天定时输出xml格式的文件, ...