关于 SuperHacker

当前版本:V1.0

Github Project Link

Super Hacker 是一个用于 Codeforces 中同时对多个人进行自动 Hack 的工具,原理是使用类似对拍的方法,随机生成数据后用各个程序运行得出结果,再将程序运行结果进行两两比对,如果不相同,那么其中至少有一个程序被成功 Hack。

Super Hacker 也可以用于对拍,目前虽没有专门开发相关功能,但只需将人数设置为 22 人,分别放置暴力和自己的代码即可。

Super Hacker 使用 GNU 许可协议开源。

功能

  • 自定义数据生成器
  • 自定义输出比对器
  • 支持最多 100100 份代码对拍(可以改代码增加,但注意效率)
  • 保存所有运行数据和输入输出文件

文件要求

  1. 文件放置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
+SuperHacker
|---hacker.exe (主程序)
|---checker.exe (自己创建)
|---data.exe (自己创建)
|--+src (自己创建)
| |---[name1].exe (自己创建)
| |---[name2].exe (自己创建)
| |---[... ].exe (自己创建)
|--+dat (自动生成)
|--+[seed]
|--+[id]
|---data.in
|---[name1].out
|---[name2].out
|---[... ].out
|---result.txt
  1. 代码文件

    被 hack 的代码,其中建议放一个题解代码,要求为可执行文件(exe),使用标准输入输出(stdio)。

  2. data

    用于自动生成数据。

    程序从标准输入(stdin)读入一个整数,为这一组数据的随机种子,并且通过标准输出(stdout)输出生成的数据。

    例子:A+B Problem 的 data.cpp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include<bits/stdc++.h>
    using namespace std;
    int main(){
    int seed;
    cin>>seed;
    mt19937 Rand(seed);
    cout<<Rand()<<" "<<Rand()<<endl;
    return 0;
    }
  3. checker

    用于文件比对。

    之后会在更新版本中提供常见的比对器模板,你也可以在 Github 项目贡献。

    建议:使用 system("fc *.out *.out") 实现较为方便

    程序从配置文件(.checker)读入两个字符串,按照自定义规则完成比对后将结果输出到文件(.result),具体如下:

    返回 意义
    1 比对通过
    0 比对未通过
    -1 比对器错误

    例子:A+B Problem 的 checker.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<bits/stdc++.h>
using namespace std;
int main(){
ifstream fin(".checker");
string f1,f2;
fin>>f1>>f2;
ifstream file1(f1.c_str());
ifstream file2(f2.c_str());
int a,b;
file1>>a;
file2>>b;
ofstream fout(".result");
if(a==b){
fout<<1<<endl;
}
else{
fout<<0<<endl;
}
return 0;
}

使用解释

  1. 命令行:开始 Hack

    如图,输入人数和每一个人的文件名,自动使用时间作为随机种子,按 Enter 后即开始运行。

  2. 命令行:比对结果

    结果将以表格显示,表示行和列对应程序的输出比对结果,如果输出 D 或 E,程序会暂停,此时至少有一个人的代码错了,如图:

    返回 意义
    - 同一个代码,无需比对
    S 输出相同
    D 输出不同(程序暂停)
    E 比对器错误