前言
心血来潮,整理一手c++对拍,分别是Linux下的脚本对拍和windows下的代码对拍
windows对拍
windows下的对拍总共三个文件分别是正解(ok.cpp)错解(bad.cpp)和对拍生成数据的文件,对拍的时候只需要运行生成数据文件(beat.cpp)即可。下面给出三个文件示例代码
正解示例代码:ok.cpp
#include <bits/stdc++.h>
#ifdef LOCAL
#include "algo/debug.h"
#else
#define debug(...) 42
#endif
int main() {
std::cin.tie(nullptr)->sync_with_stdio(false);
int a, b;
std::cin >> a >> b;
std::cout << a + b << "\n";
}
错解示例代码:bad.cpp
#include <bits/stdc++.h>
#ifdef LOCAL
#include "algo/debug.h"
#else
#define debug(...) 42
#endif
std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());
int main() {
std::cin.tie(nullptr)->sync_with_stdio(false);
int a, b;
std::cin >> a >> b;
if (rng() % 10 >= 1) {
std::cout << a + b << '\n';
} else {
std::cout << a + b + 1 << '\n';
}
}
对拍示例代码:beat.cpp
.\beat是我的对拍存放的目录,可以自行更改,如果存放在你当前开的文件夹下面,代码中的.\beat\都可以不打,默认运行当前文件。
#include <bits/stdc++.h>
int main() {
#define COMPLILE // 是否重新编译,不需要重新编译注释掉就行了
#ifdef COMPLILE
system("g++ -std=c++2a .\\beat\\ok.cpp -o .\\beat\\ok.exe -O3");
system("g++ -std=c++2a .\\beat\\bad.cpp -o .\\beat\\bad.exe -O3");
#endif
for (int i = 0; i < 1000000; ++i) {
std::cout << "Testcase: " << i << '\n';
{
std::ofstream cout("in.txt");
std::uniform_int_distribution<int> dist(2, 1e9);
std::mt19937 mt(std::chrono::steady_clock::now().time_since_epoch().count());
#define rng() dist(mt)
// std::random_device rd;
// #define rng() dist(rd)
cout << rng() % 10 << ' ' << rng() % 10 << "\n";
cout.close();
}
system(".\\beat\\ok.exe < .\\beat\\in.txt > .\\beat\\ok.txt");
system(".\\beat\\bad.exe < .\\beat\\in.txt > .\\beat\\bad.txt");
// getchar(); // 单步回车比较
// system("fc .\\beat\\ok.txt .\\beat\\bad.txt")
if (system("fc .\\beat\\ok.txt .\\beat\\bad.txt")) { // 自动比较
/* 是否将正确结果和错误结果输出在输入文件,方便查看,自行选择是否需要
system("echo ok: >> .\\beat\\in.txt");
system("type .\\beat\\ok.txt >> .\\beat\\in.txt");
system("echo bad: >> .\\beat\\in.txt");
system("type .\\beat\\bad.txt >> .\\beat\\in.txt");
*/
puts("WA!!!");
break;
}
}
}
最后放一个我的文件目录结构
![](https://i.postimg.cc/B6pxjxy4/Snipaste-2024-05-22-11-27-13.png =400*300)