Arbiter 单机版 完全使用指南
Dr_Gilbert · · 科技·工程
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
作用未知。
evaldata
文件夹存储各题目的测试数据。fliter
文件夹存储内置校验器和自定义校验器(Special Judge)。players
文件夹存储选手答案。ps
文件夹存储打印选手成绩后导出的各选手的成绩单。result
文件夹存储评测过程中的评测结果信息。tmp
文件夹为评测过程中的临时文件夹。day*.info
为比赛每一场考试的信息。player.info
存储选手的姓名和编号信息,格式为编号@姓名
。setup.cfg
为比赛的主文件,存储比赛信息。task*_*.info
表示各题目的配置信息。
2.2 配置文件
本节将介绍各配置文件中配置项的作用。
setup.cfg
中,NAME
表示比赛名称,DAYNUM
表示总场次数,PLAYER
,TEAM
分别指定对应配置文件的位置。
day*.info
中,NAME
表示场次名,如 “第一试” “正式赛” 等。BASESCORE
从名字上看是基本分,但实际上貌似并没有任何作用。TASKNUM
表示试题数。
task*_*.info
的配置项较多,一个实例如下:
TITLE
貌似并没有任何作用。NAME
表示试题名(即正式比赛题面中 “目录”),其将作为提交文件名、输入输出文件名和测试数据文件前缀。
INFILESUFFIX
和 ANSFILESUFFIX
表述测试数据输入文件和答案文件的扩展名,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*_*.info
的 CCL
项,将其设置成使得选手代码和交互器代码共同编译的命令即可。
但这样会遇到一个问题,每个程序编译前,tmp
文件夹都会清空。所以可以在编译前使用 cat
命令将相关文件复制到 tmp
目录即可。以下是一个实例:
上图即为比赛目录结构,我们将 grader.cpp
和 interact.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.cpp
和 interact.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 更新日志
- 2023.1.26 发布初版。
3.5 致谢
- 中国计算机学会,公开了 Arbiter 单机版系统。
- 中国计算机学会,公开了 NOIP 2022 试题。
- 被作为示例使用的选手,提供了示例中的代码。