题目数据配置
From UOJ 部署指北,有一定改动。
数据
对于传统题,您上传的 zip 数据包应当包括这些内容:
- 题目配置文件
- 测试数据
- 额外测试数据(包括题面中所给的测试样例)
- (开启 hack)数据检验器
- (开启 hack)标准程序
- (可选)下发文件
注意在 zip 包中不要有额外的外层文件夹,即打开 zip 包时就应该看到以上的所有内容。
题目配置文件
题目配置文件应当命名为 problem.conf
。这是一份配置的样例:
n_tests 10
n_ex_tests 1
n_sample_tests 1
input_pre www
input_suf in
output_pre www
output_suf out
time_limit 1
memory_limit 512
output_limit 64
use_builtin_judger on
use_builtin_checker ncmp
测试点
n_tests 10
n_ex_tests 1
n_sample_tests 1
这三行分别代表标准测试点、额外测试点和测试样例的数量。其中,额外测试点的前几个一定是测试样例,所以你必须把题目中给出的测试样例放到额外测试点当中。
UOJ 的 extra test 是指在 AC 的情况下会测额外数据,如果某个额外数据通不过会被倒扣3分。
input_pre www
input_suf in
output_pre www
output_suf out
这四行分别指明了每个测试点输入文件的前缀、扩展名、输出文件的前缀、扩展名。注意输入输出的前缀名不能为空串。
标准测试点的文件名应当形如:www1.in、www1.out、www2.in、www2.out……
额外测试点的文件名应当形如:ex_www1.in、ex_www1.out、ex_www2.in、ex_www2.out……
特别的,如果你想给每一个测试点单独的分数,你可以一个点一个子任务使用下面语句:
point_score_x y
表示将第 $x$ 个测试点的分值改为 $y$。不使用该语句时,默认每个测试点的分值为 $\lfloor \frac{100}{\text{测试点数}} \rfloor$。
子任务
题目默认不开启子任务。如果需要开启子任务,需要在 problem.conf
中加入一定内容,下面是一个示例:
n_subtasks 3
subtask_end_1 11
subtask_score_1 30
subtask_end_2 25
subtask_score_2 30
subtask_end_3 35
subtask_score_3 40
subtask_dependence_2 1
subtask_dependence_3 many
subtask_dependence_3_1 1
subtask_dependence_3_2 2
其中 n_subtasks
表示子任务数量,subtask_end_x
表示第 $x$ 个子任务的结束测试点,subtask_score_x
表示第 $x$ 个子任务的分数。
如果需要开启子任务依赖,下面的 subtask_dependence_x y
表示的就是让第 $y$ 个子任务作为第 $x$ 个子任务的依赖子任务。如果第 $x$ 个子任务有多个依赖子任务,则需要先加入 subtask_dependence_x many
,再一一指定依赖子任务,如上例所述。
注意本站的子任务设置不支持部分分,子任务中任意一个测试点不获得满分则该子任务直接得 0 分。
具体可以参考 #7 的题目配置。
限制
time_limit 1
memory_limit 512
output_limit 64
这三行配置了评测时对选手程序的时间限制、内存空间限制和输出限制。
时间限制的单位为秒,不能为小数。内存空间和输出限制的单位为 MB。
评测器(judger)
use_builtin_judger on
表示使用 UOJ 的内部评测器。当你的题目的评测方式与传统评测方式不同(如 Quine)时需要自行编写 judger。详见此处。
校验器(checker)
校验器用来检查选手程序的输出是否正确。
use_builtin_checker ncmp
使用该句表示使用内置的校验器,其参数表示使用的校验器类型。testlib 提供了很多奇奇怪怪的校验器。
校验器 | 功能 |
---|---|
wcmp |
比较字符串序列 |
fcmp |
逐行进行全文比较,不忽略行末空格,忽略文末回车。 |
icmp |
比较单个整数 |
ncmp |
比较有序 $64$ 位整数序列 |
uncmp |
比较无序 $64$ 位整数序列,即排序后比较 |
acmp 或rcmp |
比较单个双精度浮点数,最大绝对误差为 $1.5 \times 10^{-6}$ |
dcmp |
比较单个双精度浮点数,最大绝对或相对误差为 $10^{-6}$ |
rcmp4 |
比较双精度浮点数序列,最大绝对或相对误差为 $10^{-4}$ |
rcmp6 |
比较双精度浮点数序列,最大绝对或相对误差为 $10^{-6}$ |
rcmp9 |
比较双精度浮点数序列,最大绝对或相对误差为 $10^{-9}$ |
rncmp |
比较双精度浮点数序列,最大绝对误差为 $1.5 \times 10^{-5}$ |
hcmp |
比较单个有符号大整数 |
lcmp |
逐行逐字符串进行全文比较,多个空白字符视为一个 |
caseicmp |
多组数据,比较单个整数,输出形如:Case <caseNumber>: <number> |
casencmp |
多组数据,比较整数序列,输出形如:Case <caseNumber>: <number> <number> ... <number> |
casewcmp |
多组数据,比较字符串序列,输出形如:Case <caseNumber>: <token> <token> ... <token> |
yesno |
比较单个YES 和NO |
如果其中没有你想要的校验器,那么你需要自行编写。在 problem.conf
中删除 use_builtin_checker
一句并在 zip 数据包中加入 chk.cpp
表示你编写的校验器。校验器需要使用 testlib.h
作为接口编写,在题目管理中有 testlib.h
的下载链接。
数据检验器(validator)
当开启 Hack 时,你需要上传标准程序和数据检验器,在 zip 数据包中命名为 std.cpp
和 val.cpp
。其中 val.cpp
需要使用 testlib.h
作为接口进行编写。需要注意的是 testlib.h
中的检验非常严格,甚至对空格和换行的位置都有要求。
下发文件
如果你需要在题目中给出下发的大样例、样例交互库等,可以在上传时在 zip 数据包中建立 download
文件夹,并将所有需要下发的文件放入其中,注意其中不能有文件夹,如果需要下发文件夹可以考虑进行压缩。在上传之后题目管理中 problem_x.zip
对应的链接中可以下载 download
上传的所有非文件夹文件。
上传流程
在题目管理的“数据”中选择上传数据并将 zip 数据上传。上传完毕后如果选择不开启 Hack 而当前开启了 Hack 则选择 "禁止使用 Hack",否则选择 “与 SVN 仓库同步”,如果不出现问题,则在一定时间后数据会上传完毕。
提交答案题配置
简单来说,只需要在 problem.conf
中加入 submit_answer on
即可,其余与传统题配置无异。
具体可以参考本站 #2 的配置。
交互题配置
在 problem.conf
中加入 with_implementer on
一句表示开启交互模式。注意 UOJ 暂时仅支持 OI 中的经典交互,不支持输入输出交互。
在上传的 zip
包中新建文件夹 require
并放入接口文件(即 xxx.h
)和交互库文件,交互库需要命名为 implementer.cpp
。其他与传统题配置无异。
同时 UOJ 支持 token
功能。在 problem.conf
中加入 token xxx
,其中 xxx 是一个随机字符串。在 implementer.cpp
中 UOJ 会首先检查第一行是否是 token
的随机字符串,如果不是则立即返回 Wrong Answer
,否则将 token
字符串从输出中删掉然后继续比对之后的内容。这可以有效防御一部分攻击交互库的行为。
具体可以参考本站 #8 和 #390 的配置。