新版的 Testlib for Lemons 与对 Lemon 系列评测软件的介绍
也许你要问:“Testlib 是什么?Lemon 是什么?”
关于 Testlib:
- Testlib 是一个主要由 Mike Mirzayanov 维护的 C++ 的库,维护至今(本段文字更新于 2022-09-09)。
- 如果你正在使用 C++ 出一道算法竞赛题目,Testlib 是编写相关程序时的优秀辅助工具。
- Testlib 库仅有
testlib.h
一个文件,使用时仅需在所编写的程序开头添加#include "testlib.h"
即可。 - Testlib 的源代码托管于 github.com/MikeMirzayanov/testlib。
更多信息可参见 Github 仓库或 OI Wiki 的相关页面 oi-wiki.org/tools/testlib/。
关于 Lemon、LemonPlus 和 LemonLime:
关于 Lemon:
- Lemon 是一个由贾志鹏编写的针对 OI 赛制的开源评测工具,于 2011 年或更早停止维护。
- 如果你需要举办一场 OI 赛制的比赛,但无法使用自建 OJ 或基于公开 OJ 提供的平台进行测试,Lemon 是进行本地测试的一个优秀选择。
- 已知 Lemon 可以在较新的 Windows 环境下运行。
- Lemon 的源代码托管于 github.com/zhipeng-jia/project-lemon。
关于 LemonPlus:
- LemonPlus 是一个由 Dust1404 基于 Lemon 开发的评测工具,于 2019 年停止维护。
- 相较 Lemon,LemonPlus 增加了许多功能,如更完善的子任务系统、支持子文件夹、支持交互题等,更多信息可参见 Github 仓库查看。
- 已知 LemonPlus 可以在 Windows 7、Windows 10 和部分 Ubuntu 环境下运行。
- LemonPlus 的源代码托管于 github.com/Dust1404/Project_LemonPlus。
关于 LemonLime:
- LemonLime 是一个主要由 Coelacanthus 和 iotang 基于 LemonPlus 开发的评测工具,维护至今(本段文字更新于 2023-09-29)。
- 相较 LemonPlus,LemonLime 增加了许多功能,如支持通信题、整理选手文件、比赛数据统计、以及数不胜数的界面优化等,更多信息可参见 Github 仓库查看。
- 已知 LemonLime 可以在 Windows 7、Windows 10、部分 Linux 发行版和部分 MacOS 环境下运行,但似乎对 MacOS 的支持不太稳定。
- LemonLime 的源代码托管于 github.com/Project-LemonLime/Project_LemonLime。
更多信息可参见 Github 仓库或 OI Wiki 的相关页面 oi-wiki.org/tools/judger/lemon/。
本文主要侧重于 Testlib 的 checker 功能,在 OI 中或称为 Special Judge。
此功能允许一道题可以同时接受多种不同的输出视作通过,本质上是对输出文件的进一步处理。
在 OI 比赛中许多题需要用到此功能。于是,如何编写一个好的 checker 就成为出题人需要考虑的问题。
不完善的 checker 可能会出现把本不应该通过的输出判断为通过,或把本应该通过的输出判断为不通过的现象,甚至有可能出现 RE 的现象。
Testlib 提供了完善的 checker 接口和一系列考虑到了所有细节的 checker 可能用到的函数,也支持返回错误信息。
但是由于 Lemon 系列要求的命令行参数顺序与 Testlib 的接口不同,同时也有一些功能上的差异,所以 Testlib 不能直接移植到 Lemon 上使用。
这时 Testlib for Lemon 应运而生,这是一个修改版的 Testlib 库,添加了对 Lemon 的适配。
Testlib for Lemon 由 matthew99 基于 Testlib 的一个 2013 年后的修改版(版本号为 0.9.5,但有若干更后期的功能以及其他功能也被添加)修改而成。
此版本的 Testlib for Lemon 可以在 Ubuntu Pastebin 中找到。
但是,版本号较低意味着许多新功能没有被加入,导致使用新版 Testlib 功能编写的 checker 无法直接通过 Testlib for Lemon 移植到 Lemon 上使用。
为了解决这个问题,我通过比对差异,修改得到了新版的 Testlib for Lemons,基于目前 Testlib 的最新版修改而成,并且将持续更新。
Testlib for Lemons 的源代码托管于 github.com/GitPinkRabbit/Testlib-for-Lemons。
- 最后更新于 2023-09-29,同步至上游版本 0.9.40-SNAPSHOT(commit SHA
ffe5752
)。
如果感兴趣的话,给出差异比对过程
首先我们明确了 matthew99 版本的 Testlib for Lemon 是基于 Testlib 0.9.5 的一个修改版修改而成的。
Testlib 0.9.5 可以在 Github 的 Commit 历史中找到:
这是 Commit:- Removed disable buffers for interactive problems, because it works …;
这是头文件本体:testlib.h
。
同时,你可以点击 testlibs.zip
下载 0.9.5 的官方版,0.9.5 的我进行格式修改的版本(不改变本质,大概是添加或删除了一些空格),matthew99 的官方版,以及 matthew99 的我进行格式修改的版本。
你可以使用方便快捷的 diff 工具,比如 diffchecker.com 进行逐文件的比对。
可以发现,除了一些奇怪的功能之外,Testlib for Lemon 主要添加了(行号以上面的压缩包中的 testlib for lemon Matthew99 modified.h
中的为准):
- \(65 \sim 72\) 行的署名和用法的简要说明。
- \(75\) 行的
const char* latestFeatures[]
更新。 - \(1788 \sim 1791\) 行的
int perfectScore
、FILE* scoreFile
、bool localJudger
和double partialScore
四个变量。 - \(2078 \sim 2085\) 行的
NORETURN void InStream::quit(TResult, const char*)
函数中的对localJudger
的判断。 - \(2930 \sim 2950\) 行的
NORETURN double __testlib_quitp(double, const char*)
函数中的对localJudger
的判断。 - \(3207 \sim 3228\) 行的
void registerLocalChecker(const std::string&, const std::string&, const std::string&, int, const std::string&, const std::string& = "")
和void registerLemonChecker(int, char* [])
两个函数。
那么只需把这些内容移植到最新版的 Testlib 上即可。
有什么 requested features 也可以联系我进行添加。