Windows系统对拍程序
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系统对拍程序的更多相关文章
- [转]Linux/Windows下脚本对拍程序
[新]简单写法 (转载自:https://blog.csdn.net/ylsoi/article/details/79824655) 要求:文件输入输出,且输入输出文件需要对应 Linux: #inc ...
- 手把手教你写对拍程序(PASCAL)
谁适合看这篇文章? ACMERS,OIERS或其它参加算法竞赛或需要算法的人 对操作系统并不太熟悉的人 不会写对拍的人 在网上找不到一个特别详细的对拍样例的人 不嫌弃我写的太低幼的人 前言 在NOIP ...
- 制造测试数据的程序及对拍程序概述(Like CyaRon)
作为一名OIer,比赛时,对拍是必须的 不对拍,有时可以悔恨终身 首先,对拍的程序 一个是要交的程序 另一个可以是暴力.搜索等,可以比较慢,但是必须正确 下面是C++版对拍程序(C++ & c ...
- [zt]手把手教你写对拍程序(PASCAL)
谁适合看这篇文章? ACMERS,OIERS或其它参加算法竞赛或需要算法的人 对操作系统并不太熟悉的人 不会写对拍的人 在网上找不到一个特别详细的对拍样例的人 不嫌弃我写的太低幼的人 前言 在NOIP ...
- 对拍程序 x
一.介绍 在做题或者正式比赛过程中总会把水题做水做乱,但因为样例有坑所以直接过了样例,然后拿去评测结果发现全WA.那如何在这种情况下检查自己程序或算法的正确性呢?对拍是一个简便省事的方案. 所谓“对拍 ...
- 使用Prism6 建立 Windows 10 通用程序.
使用Prism6 建立 Windows 10 通用程序. 目标: 使用prism6,建立Windows 通用程序项目. 1, 解决方案—添加新建项目—通用—空白应用—输入名称—确定—确定 2 ,引用上 ...
- 需要正确安装 Microsoft.Windows.ShellExperienceHost 和 "Microsoft.Windows.Cortana" 应用程序。
windows 10 开始菜单修复工具 Win10开始菜单修复工具出现的原因,自从升级到Windows 10,一直BUG不断,而其中有一个BUG非常的让你印象深刻,就是开始菜单无响应,你用着用着电脑 ...
- windows中的程序放在linux上因为字符集不同出错
问题 在把windows下的一个python脚本挪到linux下的时候,出现了一个奇怪的问题,就是标题那样的报错,很明显,shell没有用对应的python解释器去解释脚本,而是直接用shell解释了 ...
- Mac OS下编写对拍程序
介绍 对拍是信息学竞赛中重要的技巧,它通过一个效率低下但正确率可以保证的程序,利用庞大的随机生成数据来验证我们的高级算法程序.对拍最大的优势在于可以通过人力所不能及的速度和数量达到验证的效果.下面我们 ...
随机推荐
- Android进程永生技术终极揭秘:进程被杀底层原理、APP应对技巧
1.引言 上个月在知乎上发表的由“袁辉辉”分享的关于TIM进程永生方面的文章(即时通讯网重新整理后的标题是:<史上最强Android保活思路:深入剖析腾讯TIM的进程永生技术>),短时间内 ...
- SpringBoot整合NoSql--(四)Session共享
简介: 正常情况下,HttpSession是通过Servlet 容器创建并进行管理的,创建成功之后都是保存在内存中.如果开发者需要对项目进行横向扩展搭建集群,那么可以利用一些硬件或者软件工具来做负载均 ...
- ts中的接口
// 接口:接口是一种定义行为和规范,在程序设计中接口起到限制和规范的作用.接口定义某一 // 一批类所需要遵循的规范,接口不关系这些类的内部实现,之规定这些类必须提供某些方法 /* 1.对批量方法进 ...
- Bash脚本编程学习笔记08:函数
官方资料:Shell Functions (Bash Reference Manual) 简介 正如我们在<Bash脚本编程学习笔记06:条件结构体>中最后所说的,我们应该把一些可能反复执 ...
- es5和es6中如何处理不确定参数
场景:求出不定参数的总数和 //利用arguments function sum () { let num = 0 //Array.prototype.forEach.call(arguments,f ...
- opencv —— src.at<Vec3b>(i, j)[0]、src.at<uchar>(i, j)、src.ptr<uchar>(i) 访问图像的单个像素
动态地址访问像素:src.at<Vec3b>(i, j)[0].src.at<uchar>(i, j) int b = src.at<Vec3b>(i, j)[0 ...
- WebDev.WebServer20.exe应用程序错误
我的.net网页,在iis运行成功,在VS2010调试网页时报一个WebDev.WebServer20.exe应用程序错误. 最后查找资料,发现了网站设置的框架是2.0,在vs2010里不能调试2.0 ...
- LOJ #2831. 「JOISC 2018 Day 1」道路建设 线段树+Link-cut-tree
用 LCT 维护颜色相同连通块,然后在线段树上查一下逆序对个数就可以了. code: #include <cstdio> #include <algorithm> #inclu ...
- Ceph集群网络切换
背景:需要对已部署好的Ceph集群切换网络,包含包含公共网络和集群网络 1 关闭所有mon节点的mon服务并修改服务器IP systemctl stop ceph-mon@storage01.serv ...
- Linux内核镜像文件格式与生成过程(转)
<Linux内核镜像格式> Linux内核有多种格式的镜像,包括vmlinux.Image.zImage.bzImage.uImage.xipImage.bootpImage等. ➤k ...