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下编写对拍程序
介绍 对拍是信息学竞赛中重要的技巧,它通过一个效率低下但正确率可以保证的程序,利用庞大的随机生成数据来验证我们的高级算法程序.对拍最大的优势在于可以通过人力所不能及的速度和数量达到验证的效果.下面我们 ...
随机推荐
- 【redisson】分布式锁与数据库事务
场景: 用户消耗积分兑换商品. user_point(用户积分): id point 1 2000 point_item(积分商品): id point num 101 200 10 传统的contr ...
- w13scan扫描器的使用
0x01 w13scan第三方包下载 环境:python3以上 下载:pip install w13scan 0x02 利用w13scan API接口编写w13scan.py from W13SCAN ...
- Java学习随笔---常用API(二)
Object类的toString方法 将一个对象返回为字符串形式,但一般使用的时候会覆盖重写toString方法 Object类是所有类的父亲 // public class Person { pri ...
- word中模板的使用
新建一个word文档,修改样式库中的样式,比如各章节的标题正式格式.设计好后,将文件保存为word模板. 一般自定义的模板默认保存在”C:\Users\lizhe\Documents\自定义 Offi ...
- gulp常用插件之gulp-eslint使用
更多gulp常用插件使用请访问:gulp常用插件汇总 ** gulp-eslint**这是一个用于识别和报告在ECMAScript/JavaScript代码中找到的模式的Gulp插件.. 更多使用文档 ...
- poj 2528 线段树区间修改+离散化
Mayor's posters POJ 2528 传送门 线段树区间修改加离散化 #include <cstdio> #include <iostream> #include ...
- 完成:vue-styled-components
基础 https://es6.ruanyifeng.com/#docs/string#模板字符串 注释:模板字符串返回字符串类型 如果${...}中的值不是字符串,将按照一般的规则转为字符串.比如,大 ...
- VUE项目编译和打包问题
今天VPN不好使,所以准备看一下VUE前端的代码.因为是乙方新发过来的,所以想着先把代码跑起来.结果发现发过来的代码里没有node_modules. 解决方式 npm install express ...
- 【终端使用】用户权限和"chmod"命令的简单使用
一.用户权限知识点 1.1.基本概念 用户是Linux系统工作中重要的一环,用户管理包括 用户管理 和 组管理. 在Linux系统中,不论由本机登录系统 或者 远程登录系统,每个系统都必须拥有一个账号 ...
- DFT 问答 I
Q: Boundary Scan是什么?应用场景是什么?实现的方法是什么?挑战是什么? A: Boundary Scan就是边界扫描,是由Joint Test action Group起草的规范,最初 ...