UOJ Logo std的博客

博客

标签
暂无

题目配置指南

2020-08-09 09:11:30 By std

题目数据配置

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$ 位整数序列,即排序后比较
acmprcmp 比较单个双精度浮点数,最大绝对误差为 $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 比较单个YESNO

如果其中没有你想要的校验器,那么你需要自行编写。在 problem.conf 中删除 use_builtin_checker 一句并在 zip 数据包中加入 chk.cpp 表示你编写的校验器。校验器需要使用 testlib.h 作为接口编写,在题目管理中有 testlib.h 的下载链接。

数据检验器(validator)

当开启 Hack 时,你需要上传标准程序和数据检验器,在 zip 数据包中命名为 std.cppval.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 的配置。

通信题配置

Here

共 1 篇博客