关于洛谷中使用 Open Hack 赛制的探索
1c1cf62a-18f2-4388-8e3c-e532db8940c7
摘要
Codeforces div3/div4/edu div2 中使用 ICPC+Open Hack 赛制。在洛谷中已经有原生的 ICPC 赛制,那么是否可以开拓一下思维,在洛谷中实现 Open Hack 赛制?本片文章将围绕此进行尝试。
ICPC+Open Hack 赛制,指在正常的 ICPC 比赛后添加 Open Hack 时间。在此期间任何人可以对任何已通过 Pretest 的代码 hack,若成功则添加进 testcase 中。待 Open Hack 结束后,所有通过 pretest 的代码将进行重测。排名会因此而发生变动。
洛谷评测机的限制
我们在“洛谷在线 IDE”中尝试以下 demo:
#include<bits/extc++.h>
using namespace std;
int main(void){
cout<<system("echo \"print(\\\"Hello world\!\\\")\" | /nix/var/nix/profiles/judge_python3-c/bin/python");
return 0;
}
output:
Hello world!
0
熟悉 linux 命令的读者很快就能明白,这段代码是在通过管道将一个 python 语句 print("Hello world!")
输入到位于 /nix/var/nix/profiles/judge_python3-c/bin/python
的解释器中。从输出中可以看到,python 的标准输出被绑定到原程序的输出,且 system
函数返回 0
说明程序正常运行。
Linux manual page 告诉我们,system
函数的本质是一次 fork 和一次 exec。因此,洛谷并未对用户创建进程或调用其他程序进行限制。这是我们在评测机中以用户身份调用其他程序的基础。
然而,洛谷评测机的所有文件系统都是不可写的。我们不可以将程序写入到文件系统后再执行。