By cong258258,LauYeeYu,Alan-Liang,更新于 2024.9.20。
2024 年 2 月,ACM Class OnlineJudge 引入了基于班级的权限机制。此后,除提交管理外,所有比赛及题目管理均包含于班级管理中。
如果需要新建班级,请联系服务器运维(「关于」页面上有运维人员的信息)。
如果任课老师有多个教学班,您需要考虑创建一个还是多个班级。同一次作业/比赛/考试只能布置给一个班级,所以如果这些教学班有共同的作业或考试,请只创建一个班级。创建班级后,您可以在班级内部给学生分组,并给不同分组的学生布置不同的作业。
在对应班级页面的「管理」标签下的「基本信息」栏中,可以修改基本信息,包括班级名称和班级简介(支持 markdown)。班级简介会显示在班级的主页上。
此功能主要用于给班级内不同学生布置不同作业。比如 ACM 班的程序设计课程会有 A/B 班的区分,作业的内容或要求有时会有所不同,那么可以使用分组功能。如果班级没有分组,那么在设立作业、比赛和考试时无需设置分组。
在对应班级页面的「管理」标签下的「分组」栏中,可以创建、修改或删除分组。
一个作业、比赛或考试可以指定给某些分组。指定分组后,不在分组中的学生视为班级外的学生,不会自动加入,不会在首页展示,手动加入后也不会计入排名(如果没有启用「为所有用户排名」)。
成为班级内学生是一个双向的过程,需要管理员设置成员,且学生主动加入班级。您可以参考加入班级相关部分。
在对应班级页面的「管理」标签下的「成员」栏中,可以修改成员。可以添加、删除、修改成员及管理员。具体参见输入框上方的文字提示。
班级管理员可以给学生添加实名信息,在评测状态、作业等榜单上,会在学生昵称旁显示实名信息。实名信息仅对本班级及具有相同标签的班级的管理员可见,学生和其他班级的管理员不能查看。(不过,OJ 运维组可以查看所有实名信息。)
在添加实名信息后,对应学工号的用户将会在首页看到一个「待加入的班级」提示,同时班级列表中的「旁听」按钮变为「加入」按钮。用户点击「加入」后,将成为班级的正式成员。
只有添加实名信息且用户也加入班级后,才能正常统计成绩,及查看用户所有提交:
- 有实名信息,用户加入班级:学生是班级的正式成员,学生本人无法主动退出班级。
- 有实名信息,用户未加入班级:学生首页将显示「待加入的班级」提示,需要学生手动点击加入。
- 无实名信息,用户加入班级:视为旁听的学生,不会自动报名作业、比赛和考试,即使手动报名也不视为正式成员。学生本人可以自行退出。此时管理员可以添加实名信息来将学生从旁听状态转为正式成员。
- 无实名信息,用户未加入班级:学生与班级无关。
这样设计主要有两个考虑:一是,一位同学(相同的学号)可能有多个用户,但一般只使用一个用户加入班级;二是,学生加入班级后,班级管理员将可以查看学生全部提交的代码,这个操作需要学生本人确认。
题目有一个所属的班级,默认情况下只有所属班级的管理员才拥有完整的权限。其他班级仍然可以在作业、比赛和考试中使用对应的题目。
一个题目具有以下信息:
- 基本信息:题目标题、发布时间、题目类型(代码题、填选题)、允许公开代码(如允许,则用户在提交时有权利选择是否公开,否则不允许公开)。
- 权限:除本班级管理员外的访问权限。
- 题面:题目描述、输入格式、输出格式、样例、数据范围。
- 题目评测数据:评测数据包,包括评测组配置、数据点配置、测试数据、标程、SPJ 等。
本班级的管理员无需特殊授权即可管理题目。
此外,本班级的管理员可以赋予其他人更高的权限(可以随时赋予或收回权限):
- 只读权限:在发布时间之前查看题目;查看本题目下任意用户提交的代码及评测状态。
- 完整权限:对题目拥有完整权限。
标签相同的班级管理员默认拥有只读权限。一般来说,这意味着您可以下载同一课程在之前的学期里上传的题目、查看这些题目下所有的提交代码,但不能修改这些题目。
如果您对无权管理的题目有疑问或修改建议,请直接联系 OJ 运维组。
在对应班级页面的「管理」标签下的「题目」栏中,直接点击下方「新建题目」。点击「新建题目」后,题目就已经存在,如果不小心新建了题目,需要删除题目,可以在题目页面「基本信息」标签下的「删除题目」处输入该题的题号以删除该题。但请注意,已经有提交记录或包含在比赛/作业中的题目不能被删除。
在对应班级页面的「管理」标签下的「题目」栏中,输入题目的题号,点击右侧「跳转」。系统将显示已经存在于数据库中的信息,可以在此基础上进行修改。修改完毕请点击各标签下的「保存」按钮。
在对应班级页面的「管理」标签下的「题目」栏中,输入题目的题号,点击右侧「跳转」。在「基本信息」标签下的「删除题目」处输入该题的题号以删除该题。但请注意,已经有提交记录或包含在比赛/作业中的题目不能被删除。
题目可添加一组或多组样例。一组样例包含名称、输入、输出和描述。如果输入/输出过大,或者不是纯文本,请将输入/输出字段留空,并在描述中说明下载地址等信息。输入和输出均为空时,题面将不显示输入和输出。
在支持多组样例前,样例分为「样例输入」和「样例输出」两个字段。您可以在「样例(旧版)」下查看这两个字段。在存在新版样例信息时,旧版样例信息不会显示在题面上。我们已将大部分题目的样例自动迁移到了新版样例,但仍有少数既有题目需要手动迁移。如果您发现迁移过程导致的数据错误,请及时联系 OJ 运维组。
- 由于文本框 Markdown 预览特性存在已知的技术问题,强烈建议在多次题面操作之间刷新一下管理界面。
- 题面文本格式请严格遵守题面格式规范。
- 所有题面相关数据都单独存储在数据库中,因此管理界面的题面选项卡的任何新增、修改、删除行为都不会影响数据包中的题面文档。
- 除标题、时间、类型外,剩余文本框均可留空,题目详情界面将不显示这一部分内容。
- 除标题、时间、类型外,剩余文本框均使用 Markdown 格式渲染,因此请特别留意输入题面内容与显示情况的不同(如在 markdown 中前置 tab 将被渲染为代码块,需要一个多余的回车表示换行等)。支持内嵌 LaTeX 单行公式(多行公式渲染存在已知的问题,请尽可能避免)。同时,若需要定义高级样式,还可以在题面中直接嵌入 html 代码与内联 css,甚至简单的 JS 脚本。
- 除标题、时间、类型外的剩余文本框中,若使用 Markdown 中 ``` 的语法将文本块包裹起来,访问题面时网页前端将自动识别此代码块并生成一个复制按钮以便进行复制。
- 若需要插入图片,建议上传到 ACM OJ 图床服务,可以使用
<img>
标签插入题面以更好的控制题目格式。 - 时空限制在上传数据时自动生成,不必在题面中手动注明。详见评测数据管理。
在 ACM Class OnlineJudge 中,作业、比赛和考试本质是上是一样的,仅在渲染方式上有所不同。考试是一种更加严格的比赛,在分类上属于比赛。
作业、比赛和考试均有其所属的班级,只有所属班级的管理员才能对其进行管理。如果在班级内新建了作业、比赛或考试,那么对应的学生就会自动加入,无需学生主动加入(管理员不会被自动加入)。具体来说,如果没有设置分组,那么所有班级内的学生都会自动加入;如果设置了分组,那么只有被指定的分组的学生会自动加入。其他的学生(包括非指定分组和其他班级的学生)仍然可以通过报名加入。
考试的特性:
- 同一时刻非管理员用户只能报名同一场考试,在考试结束前暂时无法加入新的作业、比赛或考试。
- 考试时,非管理员用户只能查看自己在考试题目上的提交,因此无法查看别人在考试题目上的提交(哪怕提交时设置为公开),也无法查看自己不在考试列表里题目的提交。
- 考试时,非管理员用户在排行榜上不能看到非正式选手(即「打星选手」)的信息,防止班级外用户出现在排行榜上,影响考生发挥。
比赛和作业的唯一区别在于,显示在比赛列表还是作业列表中。管理员可以修改比赛或作业的排行榜显示选项 (赛制):
- 显示排名:关闭此选项后,排行榜将按昵称顺序排序;
- 计算罚时:开启选项后排名将考虑罚时,关闭选项后,分数或通过数相同时排名也相同;
- 计算部分分:开启选项后将显示分数、隐藏通过数 (类似 IOI 赛制),关闭选项后将隐藏分数,只显示通过数 (类似 ICPC 赛制);
- 为所有用户排名:默认情况下,比赛只对班级成员(如果有指定分组,则只对指定的分组)进行排名,其他自行报名比赛的用户不会参与排名。选中此选项后,将对所有报名参赛的用户(无论是自动添加到比赛中的,还是手动加入的)进行排名。
罚时类似于 ICPC 赛制下的罚时:对于每道通过的题目,罚时为 (题目 AC 时间 - 比赛起始时间) + AC 前的错误提交次数 × 20 分钟。与 ICPC 不同的是,编译错误也会计算 20 分钟的罚时。未通过的题目罚时为 0。选手在比赛中的罚时为各个题目罚时的和。
我们不建议同时开启计算罚时和计算部分分。这样会使骗分选手在排名上高于正解选手,因为未通过的题目不计入罚时。
ACM 班所使用的赛制如下:
- 小作业和大部分大作业:不显示排名,不计算罚时,不计算部分分,类别为作业;
- 需要打榜的大作业:显示排名,不计算罚时,计算部分分,类别为作业;
- 机考:显示排名,不计算罚时,计算部分分,类别为考试。
在之前,ACMOJ 的赛制与显示类别 (比赛/作业) 绑定,为了计算部分分,有一部分助教将作业的类别设置为了比赛。现在请不要这样操作。
在对应班级页面的「管理」标签下的「比赛与作业」栏中,点击下方「新建比赛」,分别填写名称、起始时间(默认为当前时刻)、结束时间(请避免结束时间早于起始时间)、比赛描述,选择类型与设置。然后在下面的「题目」部分添加需要加入的题目。
在比赛页面点击「管理」。系统将显示已经存在于数据库中的信息,可以在此基础上进行修改。修改完毕请点击「修改比赛」。
在比赛页面点击「管理」,在下方找到「删除比赛」,输入比赛编号以删除比赛。
在比赛页面点击「管理」,在「题目」部分中,
- 如果要添加题目,请点击「批量添加/移除题目」,并在下方的输入框中输入题号(回车分割,不要有空行,最后一行也不能是空的),点击「添加」。
- 如果要删除题目,请点击对应题目的移除按钮删除改题。
如果班级没有分组,那么此项无法更改,默认所有班级内成员参赛。
如果班级有分组,请在比赛页面点击「管理」,在「人员与分组」部分中勾选对应分组。
注意:如果勾选了全部分组/无分组,那么将不会显示所有分组的情况,但是所有班级内学生都会被包括在内。
您可以为作业设置完成要求。设置要求后,学生将能在主页上看到自己的作业是否已完成,管理员也可以在比赛页面上查看每位学生的作业完成情况。
OJ 支持两种统计完成情况的方法:完成题目数/得到的分数,和 Python 表达式。
您可以在表达式内使用下列函数或变量:
ac(index1, index2, ...)
: 若所有这些题目(index 为题目在作业里的顺序,从 1 开始)均通过(Accepted),则返回 True,否则返回 False;ac()
: 若作业中全部题目均通过,则返回 True,否则返回 False;count(index1, index2, ...)
: 返回学生通过这些题目的个数;count()
: 返回学生通过作业中题目的个数;score(index1, index2, ...)
: 返回学生在这些题目中得到的分数和;score()
: 返回学生在作业中得到的总分;groups
: 一个 List[str],表示学生的所有分组名称,可以用'groupname' in groups
来判断学生是否在分组中。
您应该返回一个 bool,若为 True 则表示学生完成了作业,若为 False 则表示未完成。
为了 OJ 的安全性,您只可以使用下列语法:
- 整数、浮点数、字符串、True、False 常量;
- 一元运算(
not True
)、二元运算(1 + 2
,True or False
,'x' in groups
)、比较(1 <= 2
); x if cond else y
(类似于 C/C++ 中的cond ? x : y
);- list (
[1, 2]
), set({1, 2}
), tuple ((1, 2)
); - 以上提供的函数和变量。
不能使用数组下标(a[0]
)、定义函数或定义变量。
以下是一些示例:假设一次作业有五道题目,1461、1462、6437、6438 和 5033。
ac()
要求通过全部题目;count() >= 3
五选三;ac(1, 2, 3, 4)
要求通过前四道题,第五道题不做要求;ac(1, 2) and count(3, 4, 5) >= 2
要求通过前两题,后三题三选二;ac(1, 2) and score(3, 4, 5) >= 160
要求通过前两题,后三题分数之和至少 160 分;count(1, 2, 3) >= 2 if 'B班' in groups else count(3, 4, 5) >= 1
B 班要求前三题三选二,A 班要求后三题三选一。
您可以设定接受迟交,并为迟交设定截止时间。按时完成的学生和补交完成的学生会在显示中区分:
- 完成情况栏中,「已完成」为按时完成,「已补交(完成时间)」为迟交,完成时间以第一次达到设置的作业完成要求为准;
- 题目状态栏中,迟交的题目会显示字母 L,例如 (L42Y) 表示迟交未通过、提交 42 次,(L-42) 表示迟交未通过、提交 42 次。
设置迟交时,强烈建议同时在系统中设置完成情况统计,否则如果学生在作业截止后、迟交截止前通过了新的、本不需要完成的题目,或者取得了更高的分数,则学生会被记为迟交,因为 OJ 无法判定学生是否按时完成了作业。
例如,一次作业有两道题目,可任选一道完成,但未在 OJ 上设置。一位学生按时通过了一道题目,在截止时间之后,又通过了另一道题目,则此时学生提交的第二题会被认为是迟交。如果设置了作业完成条件,则提交的第二题不会显示在完成情况表上。
在比赛页面点击「管理」,在下方找到「导出提交数据」,点击即可导出提交数据。
导出的代码为每个学生每道题目符合要求(包括时间范围和提交语言,若允许迟交则包括迟交)的最晚一次最高分提交。例如,四次提交得分分别为 40、80、80、60,则将导出第三次提交的代码。
此功能会使用较多的服务器资源,敬请各位管理员不要频繁进行导出。
注意:如学生有部分符合要求的提交仍在评测,请等待评测完成后再进行导出,否则可能会导出错误的提交版本(因为评测完成前会被视为 0 分)。
导出的文件名为 export-id.zip
,其中 id
为作业、比赛或考试的编号。在此压缩包内,每个题目的提交会分别放在以题号为名称的目录下,每个目录内的文件名为 学工号-实名-用户名-提交编号-P题目编号-提交状态-得分(-late).后缀
。在每个文件中,其头部会用注释的方式包含提交一些信息,包括用户、题目、时间、状态、得分、评测详细信息、每个评测点的情况等。
ACM Class OnlineJudge 支持多种教学特化的强大评测方式。功能包括但不限于:编译时长限制;运行时间、内存、磁盘使用限制与统计;Valgrind 内存泄漏检测;Git 仓库编译评测;Verilog 评测;hpp 头文件评测;各种自定义 special judge。
简单而言,如果你需要评测的是简单的 OI 题(包括若干个输入文件,若干个标答输出文件,不使用 SPJ,通过 stdout 与输出文件进行全文对比),那么你可以使用数据 (GUI) 选项卡来进行上传;否则,我们强烈推荐你使用自由度更高的数据 (ZIP) 上传方式。
无论使用 GUI 还是 ZIP 上传的数据,管理界面都会自动提取您配置的数据点信息(从您填写的表格或从 ZIP 中的 config.json
),将其更新在题面的「时空磁盘限制(运行时)」一栏中。
填写题号,编译时长,SPJ 类型等内容,填写评测组配置与数据点配置后,点击打包上传所有数据。
-
请确认题号已存在,即题面已上传后再上传数据。
-
编译时长单位毫秒,建议值为 10000,如需从 Git 拉取编译评测可适当增加。
-
编译、运行、检查:一般为 classic, classic, compare。
-
题面:建议文件名为
description.{md,doc,docx,txt}
。此文件仅仅是为了数据包的完整性给以后的助教和管理员提供便利,其本身与数据库和网页题面显示并没有关联。若无必要给出题面情况(比如大作业的题面在 GitHub 上),这一项可省略。 -
测试数据:
- 在此选择输入输出文件,可多选。
- 输入文件命名规范:若干
数字.in
,文件名请采用连续编号的,从 1 开始的纯数字,与.out/ans
对应。 - 输出文件命名规范:若干
数字.out
或数字.ans
,文件名请采用连续编号的,从 1 开始的纯数字,与.in
对应。同时存在.out
和.ans
时后者优先级高。 - 注意:我们的 OJ 评测均采用 Linux 环境,默认 diff 时有行末空格过滤。虽然对于许多题目,换行符为 Windows 的 CRLF (
\r\n
) 还是 Linux 的 LF (\n
) 并不会产生很大的影响,但请各位出数据的助教尽可能不要出现 CRLF。
-
std:在数据包中放标程仅仅是为了数据包的完整性给以后的助教和管理员提供便利,其本身与评测并没有关联。建议命名为
solution.{cpp,hpp}
。可省略。- 对于所有评测 cpp 类题目,避免将标答命名为
main.cpp
。 - 对于评测头文件类题目,避免将标答命名为
src.h
、src.hpp
。
- 对于所有评测 cpp 类题目,避免将标答命名为
-
Special Judge:省略。
-
评测组配置与数据点配置(简易):一般无脑点击「add row」若干次即可,使得评测组条目、数据点条目均与上传的测试数据数量一致即可。
-
评测组配置(高级):记分策略。以下图为例,本题共有五个测试组,每组 20 分共 100 分。以组 1 为例,三个测试点 1, 2, 3 均通过才能获得该组的 20 分,以此类推。(本条仅为不使用 SPJ 的情况)
-
数据点配置(高级):编译评测策略。以下图为例,本题共有 11 个测试点,每个测试点限时 1 秒,内存限制约 256 MB。
- Valgrind 相关:其中,测试点 9, 10 开启了 Valgrind 内存泄漏测试(测试参数参考主页),只有经检测没有内存泄漏才算通过测试点。开启 Valgrind 测试后不允许使用 python 提交。
- Dependency 相关:其中,如果测试点 1 没有通过,那么测试点 2 不会被评测,评测详情显示
Skipped
;连带的,测试点 3 也不会被评测。 - **对于开启 Valgrind 的测试点,测试结果中 Memory Leak 的优先级高于 Wrong Answer。**因此如果你希望先测一遍正确性,再测一遍内存泄漏,那么建议你配置如下图的 7, 8, 9, 10 ,上传测试数据时,
7.in/out/ans
与9.in/out/ans
完全相同,8.in/out/ans
与10.in/out/ans
完全相同,只有 AC 了 7, 8 才会测试 9, 10。将上述评测组配置的例子与数据点配置结合起来看,那么评测组 3 就是正确性测试组,评测组 4 就是内存泄漏测试组。 - 将上述评测组配置的例子与数据点配置结合起来看,情形如下:如果某用户测试点 1 没有通过,那么测试点 2, 3 不会被评测,评测组 1 没有得分;如果某用户测试点 4 没有通过,测试点 5, 6 仍然会被评测,然而无论 5, 6 通过与否,测试组 2 都不会得分。
-
上传数据压缩包:选择一个符合要求的 zip 文件,点击上传即可。压缩包格式请认真阅读数据格式规范。
-
**由于 ACM 班服务器所在机房的网络故障,使用 ipv6 进行大量数据上传可能非常慢甚至无响应,请暂时使用 ipv4。**可以通过更改 Hosts 文件的方式强制使用 ipv4。
-
点击下载即可。此功能在题目详情页面对管理员也可见。
-
使用 ZIP 上传数据时,您可能会遇到「压缩包不符合规范」的警告弹窗,这是因为我们采用的前端 jszip 插件无法解压您的压缩包。您可以检查您的压缩包格式是否正确(例:
1000.zip/1000/config.json
),并尝试使用别的压缩软件重新压缩。您可以用 jszip 的官方链接来测试压缩包合规性。如果您确信自己压缩包的格式是对的,那么忽略此警告后可能依然可以正常评测,但题面里时空磁盘限制(运行时)一栏的信息无法显示。
由于评测系统架构经历重大升级,在 2023 年 2 月 6 日之前提交的评测无法在当前评测系统中进行管理。当前评测系统下,评测管理仅对 2023 年 2 月 6 日之后的提交有效。
有多处可以进行评测管理:
- 在「管理」界面的「评测」标签下,可进行批量重测、批量题目重测、批量取消成绩、批量题目取消成绩、批量终止评测、批量题目终止评测。
- 在题目管理页的「评测」标签下,可点击对应的按钮以重测全部提交、取消全部提交成绩或终止评测全部提交。
- 在提交详情页面,可以点击代码上方的「重测」按钮重测代码,或者点击「VOID」按钮取消成绩。
请注意,取消成绩后,如需让成绩生效,请在「管理」页面的「评测」标签下重测。
- 支持 gif,jpg,png,svg 格式图片上传,大小上限为 10MB。
- 选择文件上传后,可以预览上传图片是否符合预期,并点击按钮复制图片链接或图片 html 源码。
- 上传同一文件名的图片不会将之前上传过的图片覆盖,因为每次上传都会生成随机的新文件名。