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下编写对拍程序
介绍 对拍是信息学竞赛中重要的技巧,它通过一个效率低下但正确率可以保证的程序,利用庞大的随机生成数据来验证我们的高级算法程序.对拍最大的优势在于可以通过人力所不能及的速度和数量达到验证的效果.下面我们 ...
随机推荐
- [Contract] Solidity 变量类型的默认值
变量的默认值一般都代表 “零值”. 比如 bool 就是 false,uint.int 就是 0,string 就是空字符串. 其它组合的参考 Solidity 判断 mapping 值的存在 Ref ...
- C#实现把String字符串转化为SQL语句中的In后接的参数
实现把String字符串转化为In后可用参数代码: public string StringToList(string aa) { string bb1 = "("; if (!s ...
- java代码生成器 快速开发平台 二次开发 外包项目利器 springmvc SSM后台框架源码
. 权限管理:点开二级菜单进入三级菜单显示 角色(基础权限)和按钮权限 角色(基础权限): 分角色组和角色,独立分配菜单权限和增删改查权限. 按钮权限: 给角色分配按钮权限.2 ...
- Ubuntu P40显卡配置CUDA 10.1,CUDNN 7.6,Conda 5.2.0, Tensorflow-gpu 1.8
1. 安装CUDA 禁用nouveau vim /etc/modprobe.d/blacklist.conf 最后两行加入 blacklist nouveau options nouveau mode ...
- Docker--数据管理之Volumes
前言:我们知道docker容器内产生或修改的数据仅在该容器内有效,即容器关闭,其之前产生或修改的数据也就删除了,这明显不能满足我们大多数场景的需求.当然这只是默认,docker为我们提供了多种保存数据 ...
- JN_0014:win10命令窗口以管理员方式启动
1,先打开命令窗口 2,固定到任务栏 3,右键任务栏图标 4,右键命令提示符, 5,选择以管理员方式启动.
- 查询MySQL DB
public DataTable ConnMySql(string strRegisterNo) { try { DataTable dt = new DataTable("table&qu ...
- .NET/C# 万能 HTTP 模拟请求框架
我是一名 ASP.NET 程序员,专注于 B/S 项目开发.累计文章阅读量超过一千万,我的博客主页地址:https://www.itsvse.com/blog_xzz.html HttpHelper ...
- JS:JS中常见的 “函数名 is not a function” 错误
js中常见的错误,例如Uncaught TypeError: x is not a function 其原因除了函数本身有错之外,还有一种很奇怪的情况:函数本身没有错,但是运行时就是不能正常运行.这种 ...
- 多线程模式下高并发的环境中唯一确保单例模式---DLC双端锁
DLC双端锁,CAS,ABA问题 一.什么是DLC双端锁?有什么用处? 为了解决在多线程模式下,高并发的环境中,唯一确保单例模式只能生成一个实例 多线程环境中,单例模式会因为指令重排和线程竞争的原因会 ...