测试数据生成工具
生成信息学竞赛题目数据的库一般使用
CYaRon或者Testlib库。
CYaRon是由洛谷开发的基于Python的开源软件,用于便捷地生成 OI 题目的测试数据。Testlib是一个专为编程竞赛设计的开源C++库,由Mike Mirzayanov开发。它广泛应用于俄罗斯多项编程竞赛中,包括俄罗斯国家信息学奥林匹克竞赛(ROI)以及国际大学生程序设计竞赛(ICPC)的不同阶段。该库支持标准C++11及以上版本,兼容主流编译器如GCC和Clang。Testlib提供了测试生成器(Generator)、验证器(Validator)、交互器(Interactor)和特殊裁判(Checker)等核心组件,极大地简化了竞赛题目开发者的工作流程。
本文(不介绍CYaRon和Testlib库)旨在使用大家熟悉的C++语言介绍信息学题目数据构造工作流程。
一、准备工作
- 先准备标程
std.cpp,把标程编译成std.exe备用。 - 修改
data.app代码(生成数据)。 - 使用
gen.cpp生成数据的输出文件。 data.cpp、gen.cpp、data文件夹放同一个目录中。
二、生成输入数据(data.cpp)
//以a+b为例子,生成20个数据文件,文件名data01.in~data20.in
#include <bits/stdc++.h>
#include <sys/time.h>
using namespace std;
#define ran rand()%//利用程序生成测试数据
void make_data() {srand((unsigned int)time(NULL)); //随机数种子for (int iii = 1; iii <= 20; iii++) {char Fin[50];sprintf(Fin, "data/data%02d.in", iii);freopen(Fin, "w", stdout);int a, b;a = ran 90000 + 1;b = ran 90000 + 1;cout << a << ' ' << b;fclose(stdout);//关闭文件重定向}
}int main() {make_data();return 0;
}
C++
三、使用标程生成测数数据的输出数据(gen.cpp)
//使用标程生成输出数据,文件名data01.out~data20.outt
#include <bits/stdc++.h>
using namespace std;
int main() {for (int i = 1; i <= 20; i++) {char Fin[50], Fout[50];sprintf(Fin, "data/data%02d.in", i);sprintf(Fout, "data/data%02d.out", i);freopen(Fin, "r", stdin);freopen(Fout, "w", stdout);system("std.exe");fclose(stdin);fclose(stdout);}
}
C++
四、polygon
Polygon 是一个支持多人协作的出题平台,功能非常完善。官网描述为「Polygon 的使命是为创建编程竞赛题目提供平台。」在 Codeforces (CF) 出题必须使用 Polygon。在其它地方出题,尤其是多人合作出题时,使用 Polygon 也是不错的选择。
polygon
