关于洛谷中使用 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。因此,洛谷并未对用户创建进程或调用其他程序进行限制。这是我们在评测机中以用户身份调用其他程序的基础。

然而,洛谷评测机的所有文件系统都是不可写的。我们不可以将程序写入到文件系统后再执行。

posted @ 2024-03-26 20:59  MrPython  阅读(14)  评论(0)    收藏  举报  来源