对拍脚本

贴一下对拍的脚本

bash

1
2
3
4
5
6
7
8
9
10
11
while true; do
./make > data.in
./a < data.in > a.out
./b < data.in > b.out
if diff a.out b.out; then
printf "Accept\n"
else
printf "Wrong answer\n"
exit 0
fi
done

bat

参考自这里

1
2
3
4
5
6
7
8
9
@echo off  
:loop
make.exe %random% > data.in
a.exe < data.in > a.out
b.exe < data.in > b.out
fc a.out b.out
if not errorlevel 1 goto loop
pause
goto loop

首先@echo off 是关掉输入显示,不然你的所有命令都会显示出来的,防止刷屏。 :loop是定位标记点,和c语言里的goto很像。 中间是主体程序。 if not errorlevel 1 goto loop ,errorlevel 是上一个命令的返回值,fc在文件不同时返回1,相同时返回\(0\),这一行的意思就是,如果fc返回的不是\(1\),就跳到:loop,使劲循环。 pause,暂停,一旦fc返回\(1\),就会执行到这一行,停住程序,给你时间看数据。 goto loop,看完数据,按下任意键结束暂停,继续循环。

\(\text{windows}\)下可以用系统的随机数种子,这样生成数据更快些,不知道\(\text{linux}\)上有没有类似的东西。

写数据生成程序时这样:

1
2
3
4
5
6
7
8
9
10
stringstream ss;
int main(int argc, char *argv[]) {
int seed;
if (argc > 1) {
ss.clear();
ss << argv[1];
ss >> seed;
}
srand(seed);
}