shell 脚本介绍

略。看下面的代码自行意会

一键测试所有样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
name=problem
g++ $name.cpp -o $name -std=c++14 -Wall

for i in {1..10}
do
cp $name$i.in $name.in
time ./$name
diff $name.out $name$i.out -Z > /dev/null
if (($?))
then
echo 样例 $i 不通过
else
echo 样例 $i 通过
fi
done

注意这里的 -Z 开关可以自行调整。 $? 指的是上一个命令的返回值。

对拍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
g++ gen.cpp -o gen
g++ std.cpp -o std
g++ my.cpp -o my

while true
do
./gen
./std
./my
diff out ans -Z
if (($?))
then
echo "FAILED..."
break
fi
done

(此处的文件名只是实例,实际请自行替换)

以下是供参考的 3 个 cpp 文件:

gen.cpp

1
2
3
4
5
6
7
8
9
10
11
#include<bits/stdc++.h>
using namespace std;

mt19937 gen(random_device{}());

int main(){
freopen("in","w",stdout);

cout << (gen()%100) << ' ' << (gen()%100) << '\n';
return 0;
}

注意 mt19937random_device 用法。
如果不支持 random_device 可以使用 time(0),但牢记这样一秒里面只有一份对拍是有效的。

std.cpp

1
2
3
4
5
6
7
8
9
10
11
#include<bits/stdc++.h>
using namespace std;


int main(){
freopen("in","r",stdin);
freopen("ans","w",stdout);
int a,b;cin>>a>>b;
cout<<a+b<<'\n';
return 0;
}

my.cpp

1
2
3
4
5
6
7
8
9
10
11
12
#include<bits/stdc++.h>
using namespace std;


int main(){
freopen("in","r",stdin);
freopen("out","w",stdout);
int a,b;cin>>a>>b;
if(!a)a++;
cout<<a+b<<'\n';
return 0;
}