问者自答:

CarYon:一款基于C++的OI/ACM 比赛测试数据生成器

前言

这是干什么用的?

在举办自己的OI比赛的时候,你有没有遇到过以下问题想快速生成一段文字?

想快速进行数学运算来生成数据?

想不用freopen等时间一个一个的生成测试数据?

希望生成一组随机数据或者数列?

快速生成数据来和两个程序对拍?

那么,你可以借助CarYon和C++,来快速生成数据。目前支持的特性有:随机生成一段文章,一些单词,一些字母

脱离RAND_MAX的限制,自由拟定随机数

正在开发的数学库,支持多种特性

建一些圆形,正多边形和分数,用它来进行运算

执行test.cpp在真正1分钟内生成有强度的数据

希望各位大佬一起来协助改进这个项目。希望这个项目可以帮助大家节省时间!

有问题?

欢迎去Github仓库发issue来提问,也欢迎在此文章跟帖。

我的洛谷号:luosw

使用说明

如何安装?

npm安装(稳定版本)

可以去GitHub仓库下载最新版,链接在下一个标题那里,还可以在安装了node-js的前提下使用:

$ npm install datamaker-caryon --save

安装这个数据生成器的稳定版本。

GitHub仓库(最新版本)

大家记得star一下哦~

exe安装(稳定版本)

访问 http://luosw.fun/caryon/caryon-setup.exe 下载安装包,运行安装包,在安装目录(默认为 C://Program Files(x86)/CarYon)就可以找到对应的 caryon.h 文件。

数据生成

下面的基本操作都是要包含头文件 caryon.h,注意,在程序的目录文件夹必须包含头文件经过编译后产生的 caryon.h.gch 文件,才能使用数据生成器。

makein(1,10){

csh();

xxxxx;

}

这个操作是用来生成文件:1.in-10.in的,可以自由更改makein的两个参数进行替换。例如makein(3,5)就是生成3.in-5.in。

当我们执行完test.cpp后就会发现根目录多出来了一个文件夹,里面有1.in~10.in的文件,这就是制造的结果。

csh();命令绝对不可更改或者替换!

下面这个:

dataname="";

这个是填写前缀的,例如下面的程序:

#include"caryon.h"using namespace std;

using namespace ca;

int main(){

dataname="chen_zhe-ak-ioi";

makein(1,10){

csh();

xxx;

}

}

就会在根目录里面的文件夹data-chen_zhe-ak-ioi中生成chen_zhe-ak-ioi1.in~chen_zhe-ak-ioi10.in了。

注意,由于新版本原因,dataname字段内不可以出现空格!!!

在我们的所有东西搞完后,记得使用

closefile();

函数来释放内存空间。(效果类似于fclose,可以不写)

我们已经学会去制造in文件了,怎么创造对应的out文件呢?我们把之前的样例丰富一下:

#include"caryon.h"using namespace std;

using namespace ca;

int main(){

dataname="chen_zhe-ak-ioi";

makein(1,10){

csh();

xxx;

}

makeout(1,10);

}

此时,在test.cpp所在的目录里面必须有std.exe文件,也就是俗称的标准程序。注意一定是标准程序经过编译后的 std.exe文件,才能制造出对应的out文件。

下面我们就来制造一个随机数:

cyrand(a,b);

他的功能是返回一个在a到b之间的随机数。

这个随机数使用的MT19337(或梅森旋转法)突破了C++自带的RAND_MAX的限制。

(如果要产生一个long long范围内的随机数,用cyrand_ll())。

我们再看看怎么把整型的变量存储到输入文件里面去:

inint(a);

instring(b);

这两个函数都是把东西输入in文件的作用,如果我们要输入一个随机数,我们这么写:

inint(cyrand());

就可以了。

例如下面的程序:

#include"caryon.h"using namespace std;

using namespace ca;

int main(){

dataname="test";

makein(1,10){

csh();

inint(cyrand(0,100));

}

}

就会发现目录中data-test文件夹里面出现了 test1.in-test10.in文件,用记事本打开这些文件,就会发现每一个文件里面都有一个随机数。

如果你不知道如何利用记事本打开in文件和out文件,请右击文件,点击打开方式,找到你的记事本。或者你可以使用 Dev-C++,打开软件,将in文件拖进去即可。

对于这个程序,我们如果这样编写 std.cpp:

#includeusing namespace std;

int main(){

int a;

cin>>a;

cout<

return 0;

}

编译后把test.cpp改为:

#include"caryon.h"using namespace std;

using namespace ca;

int main(){

dataname="test";

makein(1,10){

csh();

inint(cyrand(0,100));

}

makeout(1,10);

}

再用记事本分别打开 in和out 文件,就可以发现是每个in文件的数加 $10$ 的结果了。

由于新版本的功能特性支持,在生成文件的时候会有提示,再也不用担心哪个黑框框一直跳呀跳的啦!

这就是整个数据生成器的工作原理。

我们还可以生成很多随机的东西,例如:

cyrand_bool(); //随机布尔类型的值cyrand_engs(); //随机英文小写字母cyrand_engb(); //随机英文大写字母cyrand_formatc(); //随机转义字符cyrand_word(a);//长度为a的随机词汇cyrand_article(a); //有a个词汇的随机段落cyrand_letter(); //随机字符

这些东西可以发挥想象自己去DIY,达成想要的效果。

这里还有数学库。

程序对拍

在比赛的过程中,为了检验自己复杂度低的算法是否正确,通常使用再编一个低等算法解决同样问题,然后同时使用大样例对拍这两个程序的生成结果。

现在 CarYon 终于支持对拍功能了!!!

程序的对拍可以大体分为下面几步:在当前目录编写 myprogram.cpp 并且编译成 myprogram.exe 文件;

按照数据生成模块写 test.cpp 和std.cpp;

在test.cpp后加一行:

debug(/*开始*/,/*结束*/);

例如,你正信心满满地提交自己的高精度 a+b,这个时候你就需要用低精的数值和你的程序对拍。

首先,把下面的高精度版a+b放到你的myprogram.cpp里面,编译成myprogram.exe:

#include#includeusing namespace std;

int main()

{

string a,b;

int xa[500]={},xb[500]={},tot[500]={};

cin>>a>>b;

for(int i=0;i

xa[i]=a[a.length()-i-1]-'0';

for(int i=0;i

xb[i]=b[b.length()-i-1]-'0';

int len=max(a.length(),b.length());

for(int i=0;i

tot[i]=xa[i]+xb[i];

for(int i=0;i

{

tot[i+1]+=tot[i]/10;

tot[i]%=10;

}

if(tot[len]) cout<

for(int i=len-1;i>=0;i--)

cout<

cout<

}

然后在 std.cpp 中填写最简单的 a+b;

并且这样编写 test.cpp:

#include"caryon.h"//已经包含万能头文件using namespace std;

using namespace ca; //命名空间

int main(){

dataname="a+btest"; //这里写自己的前缀 makein(1,10){

csh();

/*这里请自行看使用文档和两个测试范例填写*/

}

makeout(/*起始*/,/*次数*/);

debug(/*起始*/,/*次数*/);//程序对拍命令,可以不写 //makeout的值必须小于等于makein //请把std编译好放到本文件夹,一定要有exe文件 //感谢您的支持 return 0;

}

注意,由于新版本原因,dataname字段内不可以出现空格!!!

运行后可以发现不仅有data-a+btest文件夹,里面有a+btest1.in/out-a+btest10.in/out,还出现了一个新的文件夹debug-a+btest文件夹,里面是myprogram.exe输出的a+btest1.ans-a+b10.ans,然后自己可以运用 cmd里面的comp函数比较这两个文件的大小吧!

test.cpp使用说明

在根目录的test.cpp的原来的信息如下:

#include"caryon.h"//已经包含万能头文件using namespace std;

using namespace ca; //命名空间

int main(){

dataname=""; //这里写自己的前缀 makein(/*起始*/,/*次数*/){

csh();

/*这里请自行看使用文档和两个测试范例填写*/

}

makeout(/*起始*/,/*次数*/);

debug(/*起始*/,/*次数*/);//程序对拍命令,可以不写 //makeout的值必须小于等于makein //请把std编译好放到本文件夹,一定要有exe文件 //感谢您的支持 return 0;

}

切记不可更改程序的整体框架,否则你的执行结果会出现问题dataname是输入输出文件的前缀,不填则没有前缀;

makein()中的次数是生成in文件的数量;

makein中的csh;切记不可更改,更改会出现未知错误;

makeout中的次数必须小于makein中的,且默认是从前缀1.in开始形成out文件,可以续传。

在运行程序之前,一定要把std的exe文件放置在同样的文件夹下。

生成 a+b problem数据 test.cpp编写示范

#include"caryon.h"//已经包含万能头文件using namespace std;

using namespace ca; //命名空间

int main(){

dataname="a+b test"; //这里写自己的前缀 makein(1,10){

csh();

inint(cyrand(-1000,1000));

instring(" ");

inint(cyrand(-1000,1000));

}

makeout(1,10);

//makeout的值必须小于等于makein //请把std编译好放到本文件夹,一定要有exe文件 //感谢您的支持 return 0;

}

解释:a+b的数据是两个随机数(中间有空格),所以需要使用instring(" ");函数加入空格,同样的,如果需要换行就需要使用instring("\n");,然后就是两个随机数的问题了。

对于高精度数据,可以按照下面的循环生成:

inint(cyrand(1,9));

for(int i=0;i

inint(cyrand(0,9));

}

上述的程序仅仅可以生成一个高精度数据。

上述内容已经可以足够对noip选手的数据生成了,故之后不讲,等待用户自行探寻。如果有问题请在本界面留言,谢谢!

更新公告

CarYon 1.0发布于2020.4.14

最先版本,对标crayon

CarYon 1.1发布于2020.4.15

支持分数类的重载运算符+,-,*,/,>,>=,

支持矩阵和矩阵的重载运算符

CarYon 1.2发布于2020.4.16

支持生成随机字母,字符,文章,单词,转义字符

新增了正多边形类

支持自定义数据起始和终止

CarYon 1.2.1

隐式更新,没有实际功能更新

CarYon 1.2.2发布于2020.4.17

增加了一个灰度功能(就不告诉你是哪个)

CarYon 1.3发布于2020.4.18

新增了二次三项式类

CarYon1.3.1

修复了一个重大bug

CarYon 1.4发布于2020.4.22

新增二次三项式的加减运算。

CarYon 2.0

CarYon 2.0发布啦惹惹惹。文档有重大更新。

in/out 文件的生成增加了提示。

in/out 文件生成放在同一个子文件夹中。

增加对拍功能,同时生成myprogram.cpp的ans文件和std.cpp的out文件,这样就可以自行比较辣!

将csh()命令替换成函数,所以一定要记得加括号哦。

谢谢您的兹磁!

rail铁轨 洛谷 测试数据_你见过什么生成 OI 比赛测试数据的工具?相关推荐

  1. 洛谷P5738【深基7.例4】歌唱比赛 C语言

    ## 题目描述 n(n≤100) 名同学参加歌唱比赛,并接受 m(m≤20) 名评委的评分,评分范围是 0 到 10 分.这名同学的得分就是这些评委给分中去掉一个最高分,去掉一个最低分,剩下 m−2  ...

  2. python随机生成一个地区地址_为特定地区/国家生成随机坐标的轻量级工具?

    不得不做类似的事情,但希望在这个案例中真正统一地在欧洲传播.在import shapefile from shapely.geometry import Point, shape from numpy ...

  3. 洛谷:乒乓球,C语言

    题目背景 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及.其中 11 分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役.华华就是其中一位,他 ...

  4. 洛谷大起义胜利的经验总结

    UPD1(2019.7.11):chen_zhe解除了对我的禁言,但仍保持大脑皮层对刷题重心转到LibreOJ的决策,50年不变. 2019-07-09 9:54 结束黑暗无光的\(luogu\)统治 ...

  5. 洛谷首页代码(百度编译器)

    洛谷是一个国内著名编程网站:分享一下他首页的未登录源代码: ​ <!DOCTYPE html> <html class="no-js" lang="zh ...

  6. 洛谷 P2296 寻找道路

    感慨 周五比赛的测试题,结果到比赛结束也没有读懂题意...给的样例太少了,我一直以为我是不是spfa敲错了...没想到中间还有卡的地方 分析 题目中的一句耐人寻味的话"路径上的所有点的出边所 ...

  7. A+B Problem(洛谷-P1001)

    题目描述 输入两个整数a,b,输出它们的和(|a|,|b|<=10^9). 注意 1.pascal使用integer会爆掉哦! 2.有负数哦! 3.c/c++的main函数必须是int类型,而且 ...

  8. python高精度乘法_洛谷P1919--A*B Problem升级版(NTT优化高精度乘法)

    题目背景 本题数据已加强,请使用 FFT/NTT,不要再交 Python 代码浪费评测资源. 题目描述 给你两个正整数 a,b,求$ a \times b$. 输入格式 第一行一个正整数,表示 a: ...

  9. java 判断一个数是正整数_【Java】P1075 质因数分解—关于数学方法在解题中的运用—(OJ:洛谷)...

    点击上方"蓝字"关注我们了解更多算法思路01题目 题目来源:洛谷OJ 题目链接: https://www.luogu.com.cn/ 题目描述 已知正整数n是两个不同的质数的乘积, ...

最新文章

  1. 使用matlab进行mex编译时的路径问题mexopts
  2. 成都机场迎春运客流高峰 日均起降航班超1000架次
  3. matlab中怎么使用disp函数显示一句话同时输出变量值呢?
  4. q87主板支持cpu型号_怎么选内存,看主板和CPU的支持,取一致性约束
  5. 阿里云西安ACE同城会 | 钉钉生态应用促进企业信息化实战沙龙
  6. fastapi日志重复打印_【FastAPI】踩坑总结
  7. ZOJ1654-Place the Robots【最大匹配,图论】
  8. 怎么汇报一周开发工作情况_如何在没有经验的情况下获得第一份开发人员工作
  9. 为什么机油使用后变红_水泥固化剂的使用原理是什么,涂洒后时间为什么要足够长?...
  10. python2 http请求post、get
  11. FireFox的插件
  12. [转]使用T4模板批量生成代码
  13. 三菱plc程序三菱FX3U画圆程序,只要弄明白这个程序,就可以非常了解整个项目的程序如何去编写
  14. 贪心科技机器学习训练营(十)
  15. PAT乙级1050 螺旋矩阵
  16. excel中每三行取一个数值
  17. MYSQL 数据库对象管理实验
  18. Quartus II使用说明(Verilog HDL二选一数据选择器 )
  19. 3ds max中的物体对齐方式
  20. 2023年上学期学习计划

热门文章

  1. 呼叫中心是企业实现全渠道客户服务的刚需
  2. Windows10中使用IP地址添加网络打印机
  3. 【洛谷T7243】【CJOJ2225】【BYVoid S3】珠光宝气阁(潜入辛迪加)
  4. SQL SERVER语句——数据库操作(以银行贷款数据关系为例)
  5. Ghost恢复后Windows 7无法启动解决
  6. Java基础之泛型反射
  7. 东方木2020浅谈win10系统还原怎么操作
  8. 东方木网吧上网遇到难题:网吧浏览器总是自动刷新
  9. 手机短信中特殊字符导致链接失效的问题修复
  10. Android(安卓)APP渗透测试-总结