[OI] Testlib
Testlib 是用于实现 SpecialJudge 的一种方式
为了使用 Testlib,你需要在你的文件中引用 Testlib.h
testlib.h 下载
使用 Testlib 程序
以 Testlib 的 check 功能示例(实际上 Tesklib 不止可以实现 check 功能)
首先你需要正确的引用到 testlib.h,一般有以下两种方式
- 直接丢到编译器的
MinGW/include目录下 - 直接丢到源代码目录下(需要用双引号引用)
或者你也可以直接写具体路径,比如 #include "C:/Desktop/testlib.h" 之类的
或者使用相对路径
相对路径就是基于当前文件夹向前或向后翻的一种路径,比如对于如下目录结构:
-Desktop
-Folder1
-Folder2
-file.cpp
-Folder3
-Folder4
-testlib.h
假若你想要在 file.cpp 中引用到 testlib.h,你也可以这么写:
#include"../../Folder1/Folder2/testlib.h"
其中 ../ 表示返回上级目录
在将下发的 checker.cpp 程序编译完成后,就可以按照如下格式进行 checker
(一般来说是在终端中进行编译运行,进行之前请先跳到 checker 所在目录,并请将其他文件也放进去)
Windows checker.exe input output answer
Linux ./checker input output answer
input 题目的输入文件,这个文件也可以用数据生成器跑出来
output 你的程序的输出文件
answer 答案文件 一般情况下,你写对拍的时候是拿不到这个答案文件的,但是你仍然可以检验一部分正确性:比如通过模拟能判断出来的部分,或者是格式检验的部分。这就需要考验你对 checker 进行改写的能力了。一般在这种情况下,你完全可以在 answer 位置传一个无关紧要的文件,或者直接把 output 传进去,但是不能空着
在使用 checker 跑对拍的时候,你可能需要判断什么时候应该 pause,事实上是这样判断的:
在调用 cmd 或 Linux 终端的时候,system() 函数实际上是有返回值的,它返回的是程序主程序的 return 值。而 testlib.h 会在正确时返回 0,出现错误时返回 1,因此你可以通过这一点来判断正确性,即这么写:
if(system("checker.exe input output answer")){
system("pause");
}
编写 Testlib 程序
显然,你不应该使用标准输入输出函数(交互题等特殊题型除外),而应该使用 testlib 提供的读入函数
你需要在主函数使用入下内容以初始化 testlib
int main(int argc, char* argv[]) {
registerTestlibCmd(argc, argv);
}
此外,testlib 不支持使用 <random> 下的大部分内容,如果你真的要用 rand(),testlib 提供了两种方法:
- 使用 mt19937
- 使用内置函数
关于内置函数
* Use "shuffle", and "rnd.next()" instead of them
* because these calls produce stable result for any C++ compiler. Read
* sample generator sources for clarification.
*
* Please read the documentation for class "random_t" and use "rnd" instance in
* generators. Probably, these sample calls will be useful for you:
* rnd.next(); rnd.next(100); rnd.next(1, 2);
* rnd.next(3.14); rnd.next("[a-z]{1,100}").
关于文件读入,上述传入的三个文件,分别对应了三个 ifstream 类型的类,分别命名为:
inf 对应 input
ouf 对应 output
ans 对应 answer
它们的读入函数如下所示:
| 函数 | 功能 |
|---|---|
| char readChar() | 读入一个 char |
| char readChar(char c) | 限定读入字符,不符合则判为 _wa |
| char readSpace() | 读入一个空格 |
| string readToken() | 读入一个字符串,遇到空格、换行、eof 为止、 |
| long long readLong() | 读入一个 longlong |
| long long readLong(long long L, long long R) | 限定读入范围(包括 L,R),超出则判为 _wa |
| int readInt() | 读入一个 int |
| int readInt(int L, int R), | 限定读入范围(包括 L,R),超出则判为 _wa |
| double readReal() | 读入一个实数 |
| double readReal(double L, double R), | 限定读入范围(包括 L,R),超出则判为 _wa |
| double readStrictReal(double L, double R, int minPrecision, int maxPrecision), | 限定精度范围(包括 L,R),超出则判为 _wa |
| string readString() | 读入一个字符串 |
| string readLine() | 读入一行 string,到换行或者 eof 为止 |
| void readEoln() | 读入一个换行符 |
| void readEof() | 读入一个 eof |
| int eof() | 已到达文件末尾则返回 1 |
关于判定,使用以下三个函数
quitf(st,...) 第一个参数用来传入参数,告诉程序该答案正确还是不正确,有两种,一种为 _ac,一种为 _wa,后面主要是用于输出判断信息,会显示出来给人看,用法和格式化输出一致,如 quitf(_wa,"Answer is wrong, except %d, but read %d",ans,p);
quitp(score,..) 用来判 “部分正确”,第一个参数用来传入一个 \([0,1]\) 的实数,表示得分百分比,后面就一样了
testlib 程序会在读入格式错误,或者文件未被读完的时候报出 wrong output format 错误,为了避免这个错误,你也可以使用 while(!ouf.seekEof()) ouf.readToken() 来读完剩下的内容
[OI] Testlib的更多相关文章
- testlib.h从入门到入坟
学了这么久OI连个spj都不会写真是惭愧啊... 趁着没退役赶紧学一波吧 配置 github下载地址 我是直接暴力复制粘贴的.. 然后扔到MingW的目录里 直接引用就好啦 基本语法 引用testli ...
- 再见,OI
你好,NOIP 2015年9月1日 正式成为了福建省莆田一中的一名高一成员 后来学校搞了选修 大家都很激动 因为自己的兴趣和特长能够得到发挥了(或者说能逃课或者看好多电影) 发现选修提供的选项中有好几 ...
- 告别我的OI生涯
本文章写于2008年12月15日. 随着2008noip的结束,我也结束了我的OI生涯. 信息竞赛也许是从小到大让我最最努力的一件事.我记得参加2006noip初赛前,每天中午为了上信息课都吃不上中午 ...
- 收集一些关于OI/ACM的奇怪的东西……
一.代码: 1.求逆元(原理貌似就是拓展欧几里得,要求MOD是素数): int inv(int a) { if(a == 1) return 1; return ((MOD - MOD / a) * ...
- 继续OI
NOIP2016于2016.11.20日12:00正式结束. 我作为oi的生涯 或许会结束? 或者继续? 然而前途依然迷茫,我是否应该继?或是放弃? 距离省选还有3~4个月,我该何去何从? 虽然已经经 ...
- 再见OI
NOIP2016终章 自己弱还脑残加手残 再见OI 你好高考 你好明天 "没有泪水的日子会轻松很多 但我的心还是会痛" ------------------------------ ...
- 他们在军训,我在搞 OI(Ending)
Day 7 上午看看数学书,老师让我把导数相关的概念学了.这也没有多高大上,就是一坨公式需要背,什么 (a)' = 0 啦,什么 (xn)' = n·xn-1 啦,什么 sin'(x) = cos(x ...
- OI总结(垃圾排版就忽略了吧)
学OI一年了,到现在联赛所需要的知识已经基本学完了.现在,有必要回过头来,总结总结自己一年来学到的知识以及得到的经验教训. 基础 语言基础 C++的语言基础啥的就略了吧. 算法复杂度分析 O:复杂度的 ...
- 关于我的OI生涯(AFO){NOIP2016 后}
这篇我就随意写啦~不用统一的“题解”形式.♪(^∀^●)ノ 也分好几次慢慢更吧~ 对于NOIP2016的总结,我本想善始善终back回,但是心情不足以支撑我,那就只能有始有终了......下面进入我的 ...
- 浅谈分治算法在OI中的应用
分治虽然是基本思想,但是OI中不会出裸分治让你一眼看出来,往往都是结合到找规律里面. 先来个简单的: 奇妙变换 (magic.pas/c/cpp) [问题描述] 为了奖励牛牛同学帮妈妈解决了大写中 ...
随机推荐
- Jmeter计数器
计数器(Counter)配置起点.最大值和增量,计数器将从开始循环到最大值,然后从头开始,继续这样直到测试结束 1.计数器 是可以根据线程计数的.组件路径[线程组->配置元件->计数器] ...
- 从.net开发做到云原生运维(五)——云原生时代绕不开的Kubernetes
1. 前言 前面的几篇文章主要是讲.net技术栈里的web开发技术,只是单纯的开发,从一个简单的项目到最后的打包成镜像进行分发. Kubernetes算是开启了一个新时代. 2. Kubernetes ...
- 关于英语的语言规范问题——美式英语、英式英语和中式英语(Chinese English)到底哪个才是正宗 —— 中式英语才是英语世界的未来
因为日常生成生活中总是会使用英语进行阅读.写作.学习和交流表达,由于小的时候是学传统正宗英语(英式英语),后来长大后因为美国实力强又开始学这个时候的正宗英语(美式英语),但是由于个人的能力问题(农村娃 ...
- Kotlin 循环与函数详解:高效编程指南
Kotlin 循环 当您处理数组时,经常需要遍历所有元素. 要遍历数组元素,请使用 for 循环和 in 操作符: 示例 输出 cars 数组中的所有元素: val cars = arrayOf(&q ...
- [考试记录] 2024.8.10 csp-s 模拟赛18
80 + 20 + 0 + 70 = 170 第三题应该有 10 分暴力的,但我没打. T1 星际旅行 题面翻译 总共有n个节点,m条路径,要求其中m-2条路径走两遍,剩下2条路径仅走一遍,问不同的路 ...
- Minnaert
Minnaert 假设气泡关闭时发生周期性膨胀和收缩,周围水也跟着振动,就嗷地一声叫了出来!设有个半径为 \(r\) 的泡形成后开始简谐振动,半径有 \[r=r_0+a\sin\frac{2\pi t ...
- Web端OA办公后台管理系统(使用AxureRP设计)思路与效果分享
本期带来一套OA办公后台管理系统(办公一体化)的设计分享.本次的作品设计,使用AxureRP软件. 一套实用的后台OA系统,一定是功能强大.能覆盖常用功能的.本次分享的系统,包含组织.员工管理.考勤. ...
- Ubuntu 安装 Docker Desktop
介绍 Docker 有两种版本:Docker Desktop 和 Docker Engine (也称作 Docker CE).Docker Desktop 是带图形界面的版本,非常适合需要在桌面环境中 ...
- LaTeX 编译 acmart 文档报错:hyperref must be loaded before hyperxmp.
在编译一篇从 arXiv 下载的文档时遇到如下错误: Package hyperxmp Error: hyperref must be loaded before hyperxmp. 根据 GitHu ...
- AI驱动的PlantUML:快速生成专业级UML类图和用例图
承接前文关于如何运用 AI 工具生成时序图的内容[1],今天我们继续探讨 AI 驱动的 PlantUML:高效创建专业的 UML 类图与用例图. [1]: https://juejin.cn/post ...