如何在 Linux 上使用对拍

Aewrxuk / 2023-08-21 / 原文

和 Windows 差不多,你需要以下几个文件:

我们依次来看里面都有什么:

bf.cpp:

这个 cpp 是用来使用暴力得出正解的。

#include <bits/stdc++.h>

#define file(x) freopen(x,"r",stdin);
#define clos(x) freopen(x,"w",stdout);

using namespace std;

int main()
{
	file("a.in");clos(a.out);
	// 这是正确的暴力代码
	return 0;
}

data.cpp:

就是数据生成器,根据需求的格式生成数据即可。

#include <bits/stdc++.h>

#define file(x) freopen(x,"r",stdin);
#define clos(x) freopen(x,"w",stdout);

using namespace std;

const int seed=114514;

mt19937_64 mt((unsigned long long)&seed);

inline int rand(int l,int r)
{
	return uniform_int_distribution<int>(l,r)(mt);//<>不填写默认为int类型
	// uniform_int_distribution生成整数,<>不填写默认为int 
	//uniform_real_distribution生成实数 ,<>不填写默认为double 
}

int main()
{
	clos("a.in");
	// 这是数据的格式 赋值直接a=rand(1,10000)即可
	return 0;
}

dp.bash:

主要是让终端去运行的对比操作,文件名具体看自己叫什么。

t=0
while true;do
let t++
echo "# "$t
./data
./bf
./text
if diff a.ans a.out -Z;then
	printf "AC\n"
else
	printf "WA\n"
	break
fi
sleep 0.1
done

text.cpp:

用来放自己的代码。

#include <bits/stdc++.h>

#define file(x) freopen(x,"r",stdin);
#define clos(x) freopen(x,"w",stdout);

using namespace std;

int main()
{
	file("a.in");clos(a.out);
	// 这是你要测试的代码
	return 0;
}

然后打开终端,找到文件位置,先将每个文件编译一下,g++ text.cpp -o text 类似的格式即可,dp.bash 需要用 chmod +x dp.bash 去编译,可以通过输入 ll 来看是否全部编译过:

每一个要运行的文件名最后的 x 都在说明是编译好的,注意每次修改后记得及时在终端重新编译。

最后直接输入 ./dp.bash 就可以开始对拍了,ctrl+c 可以退出对拍。

我将模板的链接放到这里,自己根据需要去使用即可。