Arbiter 单机版 完全使用指南

· · 科技·工程

0 前言

Arbiter 是 NOI 赛事中的官方评测软件,但网络上对其用法的介绍并不完全,洛谷日报中仅有的一篇介绍内容过少,且介绍的并非当前版本。因此,在这篇文章中,我将根据我的使用经验和研究,详细说明 Arbiter 各功能的使用方法。本人 OI 水平非常拉,也算是在退役前为 OI 做一些贡献。

由于以下内容均为个人整理,故难免有缺漏和错误,如读者发现缺漏或错误,请联系本文作者。

免责声明:如利用本文内容在正式比赛中进行恶意破坏,后果由恶意破坏者自行承担。

版权声明:文章中使用的选手代码版权归对应选手所有。其余文章内容(不包括附件)由文章作者 @Dr_Gilbert 原创,采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议共享。具体内容可在此参阅。

1 基本使用

1.1 准备工作

首先,在 NOI 官网下载 NOI Linux 2.0(链接见附录),然后在物理机或虚拟机上安装 NOI Linux,安装方法在此不再赘述。

安装好系统后进入桌面,点击左下角的 “显示应用程序” 按钮(九个点)打开所有应用程序,在下面选择 “全部” 后,找到 Arbiter_local 并点击打开。

打开后会显示以下界面,各按钮的功能如图所示:

若选择 “打开现有比赛”,则需要打开新建比赛时生成的 setup.cfg 文件。

1.2 试题配置

接下来,将以 NOIP 2022 的试题配置为例,展示 Arbiter 单机版的基本使用。

首先输入比赛名称,并选择存储目录。需要注意的是,存储目录中不能出现中文,否则会导致评测时没有反应。例如,不能在桌面上建立比赛文件夹,因为 “桌面” 也是一个中文目录。

点击确定后,会出现一个两栏的界面,在左侧 “试题列表” 中右键,并选择 “添加考试” 即可添加一天的考试。接下来左侧 “试题列表” 中会出现 “第1场--day1” 的字样,在其上右键,选择添加试题,会出现一个 “Unknown”。左键点击之,即进入如下配置界面。

以上各项按题目实际调整即可,下面一栏的 “编译选项” 即为在编译命令后添加的选项开关,和正式比赛题面上 “编译选项” 的含义完全一致。若勾选 “均等分值”,则每个测试点的分数将为总分除以测试点个数,向下取整。比较方式建议按实际选择,内置整数比较,浮点数比较和字符串比较。关于 Special Judge 的配置,请参阅下一章。

这个界面只能配置整数时空限制。如需要非整数的时空限制,请参阅下一章。

注意:为防止崩溃而导致的配置丢失,建议每完成一题的配置就按 Ctrl+S 保存。

各试题配置完成后,试题配置界面如下所示。

其中 “插件类型” 即为选择的比较方式对应的校验器,其中 meow 试题使用的是自定义校验器,具体配置将在下一章说明。

1.3 测试数据配置

首先将所有测试数据放在一个文件夹中,并将数据文件名格式改为 <probname>.<ext><probname> 指题目配置时使用的题目名称,<ext> 指对应文件的后缀名,输入文件后缀名应为 .in,答案文件后缀名应为 .out

然后,将所有测试数据放到比赛目录中 evaldata 文件夹里。如图所示:

~/noip 为比赛目录,则应将所有测试数据放到其子文件夹 /evaldata 中。

需要注意的是,应当将所有题目的测试数据(包括输入文件和答案文件)放在同一个文件夹下,不需要为每道题分别建立子文件夹。

1.4 选手信息导入

注意:此处的演示数据来源于安徽省 NOIP2022 代码公示。如认为此处的使用有侵权之嫌,请与本文作者联系。

在 Arbiter 中,点击上方 “试题评测” 选项卡,切换到试题评测界面。人数较少的情况下,可以如图点击右侧 “添加选手” 逐个添加选手。

也可以先将选手名单制作成 csv 文件,然后点击右侧 “导入名单” 进行批量导入。csv 文件的具体格式为,第一列为编号(准考证号),第二列为姓名,没有标题行。选手的编号没有强制的格式要求,但若格式为 XX-XXXXX 则可以显示选手省份,否则对评测也没有影响。本文的附件中提供了一个 namelist.csv 的实例供参考。

注意:csv 文件必须使用 Unicode 编码。

选手列表导入完成后,建议暂时关闭 Arbiter,转到比赛文件夹,并打开 players 子文件夹。新建子文件夹 day1,并将所有选手的选手目录复制到文件夹 day1 中,如图所示。

各选手的选手目录名应为导入过程中确定的选手编号,而非选手姓名。选手目录的文件结构可参考 NOI 官网技术规范,简单来说就是各题分别建立子文件夹,并将代码放入对应的子文件夹中。

1.5 评测

注意:由于 Arbiter 在评测时不会自动开大栈空间,故如需评测需要很大栈空间的试题(例如建造军营),请参阅附录中修改默认栈空间的方法,否则会导致评测结果有严重偏差!

导入完成后,再次打开 Arbiter,选择 “打开现有比赛”,选择刚才创建的比赛目录,打开 setup.cfg 即可。

转到试题评测选项卡后,如下图所示,首先选择评测场次,第 1 场即为 day1,然后选择需要评测的选手,既可以点击右侧方框中 “全选/取消全选”,也可以在选手列表中点击选手编号(点编号前面的复选框没反应)选择要评测的选手。接下来点击左下角 “评测选定选手” 按钮,将弹出 “指定评测范围” 对话框,可以选择要评测的试题进行评测。

若评测出现问题,请检查比赛目录中是否存在中文,校验器是否正确配置。若试题配置没有问题,请尝试将比赛目录中 result 文件夹中的子文件夹 day1 整个删除后重新测试。若没有 result 文件夹,则需要创建该文件夹。评测过程如下图所示:

1.6 成绩统计

评测完成后,可以切换到 “成绩统计” 选项卡,界面如图所示:

注意:此处评测成绩和 NOI 官网成绩可能存在差异,是演示环境非标准测试环境所致。

“打印选手成绩” 功能可以以 PDF 格式导出所有选手的成绩单,导出后的成绩单在比赛目录下 ps 文件夹里。成绩单中包含各测试点的详细得分信息。“导出成绩” 功能可以将总成绩和各题目成绩导出成 .csv 格式文件,“打印总成绩” 功能可以将每场的总成绩导出到 PDF 文件或直接打印。“设定分数段” 则可以统计各分数段的人数。

”分组统计“ 选项卡中,分组以省份为标准,可以看到各省份的最低分、最高分、平均分。”试题统计“ 选项卡中,可以看到每题各测试点的得分情况。”等级统计“ 中,可以设定人数或百分比(若设定人数,直接输入人数,否则输入一个百分比)进行评奖。

2 进阶使用

2.1 比赛目录结构

Arbiter 的比赛目录结构如图所示(打印选手成绩后)。

其中,data 文件夹,final 文件夹,team.info 作用未知。

2.2 配置文件

本节将介绍各配置文件中配置项的作用。

setup.cfg 中,NAME 表示比赛名称,DAYNUM 表示总场次数,PLAYERTEAM 分别指定对应配置文件的位置。

day*.info 中,NAME 表示场次名,如 “第一试” “正式赛” 等。BASESCORE 从名字上看是基本分,但实际上貌似并没有任何作用。TASKNUM 表示试题数。

task*_*.info 的配置项较多,一个实例如下:

TITLE 貌似并没有任何作用。NAME 表示试题名(即正式比赛题面中 “目录”),其将作为提交文件名、输入输出文件名和测试数据文件前缀。

INFILESUFFIXANSFILESUFFIX 表述测试数据输入文件和答案文件的扩展名,PLUG 表示选择的评测插件(如本题选择了单行多个数字比较),TYPE 表示提交类型,值为 SOURCE 表示提交源代码,值为 ANSWERS 表示提交答案文件。

LIMITS 表示时间限制,是一个实数MEMLIMITS 表示空间限制。SAMPLES 表示测试点数目。

CCL 表示各语言对应的编译选手源程序时的编译命令。%o 表述输出的可执行程序文件名,%i 表示选手的源程序文件。

MARK=i@j 表示测试点的分值。注意到图片中有几个测试点这一行是缺失的,对于没有指定分值的测试点,测试点分值默认为 10 分。

注意:编辑配置文件时,请将 Arbiter 先关闭。编辑配置文件并再次打开后,不要再打开对应的题目配置界面,否则可能会导致改动失效。

2.3 非传统题的配置

2.3.1 Special Judge 的配置方法

Arbiter 的 Special Judge 评测方式为,读取 _eval.score 文件,其第一行为一个字符串,作为评测结果,第二行一个整数作为该测试点的得分比例(范围从 0 至 10,分别表示 0% 至 100% 的分值)。Special Judge的返回值与分数无关。

Arbiter 调用 Special Judge 程序时,将传入三个参数,分别表示选手输入文件,选手输出文件和选手答案文件。Special Judge 需要将评测结果和分值输出到 ./tmp/_eval.score 中。

注意:单机版的评测结果输出文件和赛后 CCF 下发的 Special Judge 中不同。

附录中包含了一个 Special Judge 的实例,供参考。

2.3.2 提交答案题的配置方法

只需将试题配置界面 “提交方式” 一项改为 “答案文件” 即可。提交答案时,将各测试点的输出文件命名为 <题目名><测试点编号>.out 即可。

2.3.3 交互题的配置方法

首先考虑,NOI 类型的交互题需要将选手代码和交互器代码共同编译,还需要头文件进行接口共享。参考 2.2 中 task*_*.infoCCL 项,将其设置成使得选手代码和交互器代码共同编译的命令即可。

但这样会遇到一个问题,每个程序编译前,tmp 文件夹都会清空。所以可以在编译前使用 cat 命令将相关文件复制到 tmp 目录即可。以下是一个实例:

上图即为比赛目录结构,我们将 grader.cppinteract.h 直接放到了比赛目录下(即 tmp 目录的上一层)。事实上,放置这两个文件的目录并非一定是比赛目录,此处这样演示只是为了方便。下面是 task1_2.info 中的内容:

可以发现,除了 CCL 项外,其它各项均与传统题完全一致。CCL 中的命令执行位置为比赛目录中 tmp 文件夹下,故下面命令中所有相对路径均以 tmp 文件夹为基准。CCL 项的命令如下:

cat ../interact.h > ./interact.h & g++ %i ../grader.cpp -o %o -O2 -std=c++14 -static

这行命令以 & 隔开,先后分别是两个命令。第一个命令:

cat ../interact.h > ./interact.h

表示将当前目录的父目录中的 interact.h 中的内容输出到当前目录中的 interact.h 中。实现了复制头文件的操作。第二个命令:

g++ %i ../grader.cpp -o %o -O2 -std=c++14 -static

表示将 %i(选手代码)和父目录中的 grader.cpp 执行多文件编译,输出的可执行文件名为 %o,编译选项为 -O2 -std=c++14 -static。由于 grader.cppinteract.h 本身就在同一目录,因此不需要将 grader.cpp 也拷贝到 tmp 目录。

2.3 节中介绍的非传统题型的具体配置将在附录中提供。

3 附录

3.1 本文提及的材料下载

此处提供的材料包括文章中配置的两场比赛的比赛目录(不包含 NOIP 2022 测试数据)和文中截图。

可以在该题附件区下载使用。

3.2 修改系统默认栈空间

如图所示,首先打开 “文件” 应用,然后点击 “其他位置”,依次进入对应文件夹,最终到达 /etc/security 目录。然后在目录中右键,选择 “在终端打开”。

接下来,在终端中输入如下命令,为自己加上对文件 limits.conf 的写入权限:

sudo chmod 666 limits.conf

然后双击 limits.conf 并打开,在文件最后一行前添加一个空行,并输入如下配置:

* - stack 524288

表示将所有用户的栈空间限制设为 512 MiB,若系统只用于评测,也可以直接设为 2 GiB 或更多。设置完后保存。接下来还原权限,以免误修改:

sudo chmod 664 limits.conf

重启系统,打开终端输入 ulimit -s,若显示为之前设置的值,则表示修改成功。

3.3 展望未来

一些想写,但因为各种原因没有写的内容。

3.4 更新日志

3.5 致谢