也許你要問:“Testlib 是什么?Lemon 是什么?”
關於 Testlib:
- Testlib 是一個主要由 Mike Mirzayanov 維護的 C++ 的庫,維護至今(本段文字更新於 2021-02-17)。
- 如果你正在使用 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 開發的評測工具,維護至今(本段文字更新於 2021-02-17)。
- 相較 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/judgers/#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。
如果感興趣的話,給出差異比對過程
首先我們明確了 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 也可以聯系我進行添加。