2024 寒假更新日志
我们在 2024 寒假中进行了诸多变动,包括引入 python、引入新的班级机制、支持在 Git 提交时加入助教指定的文件一起编译、助教指定文件与用户提交冲突检查、增加 Bad Problem 状态、支持作业的导出功能等。
我们更新的内容有:
- 只显示可以评测的语言
- Python 支持
- 引入班级机制
- 改进编译时助教指定的辅助编译文件的执行流程(包括支持在 Git 提交时加入助教指定的文件一起编译、助教指定文件与用户提交冲突检查)
- 增加 Bad Problem 错误状态
- 支持导出作业、比赛、考试的提交数据
只显示可以评测的语言
在之前的 OJ 中,无论题目是否有限制(如设定为 verilog 语言、只允许提交头文件),提交时可以选择的语言并不会有变化。
现在,通过在分析数据包时将支持的语言写回数据库,我们支持了只显示可以评测的语言。
具体来说:
- 对于采用 Verilog 评测的题目,将只能提交 verilog;
- 对于提交头文件的题目,将只能提交 C++;
- 对于有内存泄漏检查的题目,将只能提交 C++ 或 Git;
- 对于评测方式为「自定义评测」的题目,将只能提交纯文本(会视作 C++);
- 对于没有数据包的题目,将不能提交。
Python 支持
ACMOJ 现已支持提交 Python 代码(时间和内存限制与 C++ 相同),具体请见这篇博客。
引入班级机制
我们注意到,由于现在使用 ACMOJ 的班级较多,无论是管理员出题以及管理比赛,还是用户报名比赛,都不是特别方便。而且管理员可以看到所有人的代码,甚至可能会不慎破坏 ACMOJ 上原有的题目。因此,我们引入了班级机制。
关于管理员的具体操作,请看ACMOJ 管理入门。
班级权限机制
在新机制下,每道题、每个比赛(含作业、比赛和考试)都属于特定的某个班级,由该班级的管理员负责。
每个班级有三个重要信息:班级名称、班级标签和学期。班级标签用于与往届的数据共享,可以拥有一部分的题目权限(见后面题目权限的解释)。学期用于判断学生是否可以加入班级。
管理作业、比赛和考试只能由班级管理员完成。除了之前已经支持的操作1外,管理员现在还可以修改比赛描述、选择是否为所有用户排名(不勾选则只有指定的班级成员才可以参与排名)、填写需要完成的分数/题目数、修改允许使用的语言(只有用勾选语言的提交才会计入结果)。
题目的权限分为两个部分:只读权限和完整权限。只读权限对应同标签但不同班的管理员,可以在发布时间之前查看题目、下载题目数据包、查看本题目下任意用户提交的代码及评测状态。完整权限对应班级的管理员,可以拥有完整的修改权限。除此以外,具有完整权限的管理员还可以将权限赋予给其他人。具体请见管理界面使用指南中题目权限的部分。
此外,之前未发布的题目名称可以从评测状态处发现的问题已经修复,无权限查看的用户会显示为 [题目未发布]。管理员无需在题目发布前用无关题目名称替代题目真实名称。
加入班级
加入班级是一个双向的过程,需要管理员设置成员,且学生主动加入班级。
对于学生,请加入需要加入的班级(如果班级的管理员已经将你设置为成员,那么你可以在首页看到加入班级的选项)。您也可以在「班级」页面查看所有班级,然后点击「加入」加入自己的班级,或者点击「旁听」来追踪其他班级的作业、比赛和考试。
对于管理员,请将您班级的学生加到成员中。如需要设置分组,请为成员设置分组。具体请见管理界面使用指南中修改成员部分和修改分组部分。
正式加入班级后,您将自动参加班级内分配给您的所有作业、比赛和考试。旁听班级后,该班级的作业、比赛和考试将显示在主页,但不会自动报名参加。
一般情况下,只有班级的正式成员会参与作业、比赛和考试的排名,但管理员可以将作业、比赛或考试设置为「为所有用户排名」,此时所有报名参赛的用户都将参与排名。
如果管理员已经将您的学号加入到班级成员当中,但您没有加入班级,管理员将无法统计您的成绩,也无法管理到您。
总的来说,对于下面的四种情况,具体的处理方式为:
- 有实名信息,用户加入班级:学生是班级的正式成员,学生本人无法主动退出班级。
- 有实名信息,用户未加入班级:学生首页将显示「待加入的班级」提示,需要学生手动点击加入。
- 无实名信息,用户加入班级:视为旁听的学生,不会自动报名作业、比赛和考试,即使手动报名也不视为正式成员。学生本人可以自行退出。此时管理员可以添加实名信息来将学生从旁听状态转为正式成员。
- 无实名信息,用户未加入班级:学生与班级无关。
这样设计主要有两个考虑:
- 一位同学(相同的学号)可能有多个用户,但一般只使用一个用户加入班级;
- 学生加入班级后,班级管理员将可以查看学生全部提交的代码,这个操作需要学生本人确认。
加入班级后,学生将会在首页显示与之相关(包括正在进行、即将开始和刚刚结束)的作业、比赛和考试。
改进编译时助教指定的辅助编译文件的执行流程
在之前的 OJ 中,助教指定的辅助编译文件会与用户提交中的文件冲突,造成竞争,引发不确定的结果2。比如,对于 C++ 头文件题,如果助教指定的文件中有 src.hpp
,则会和用户的提交的文件(会在编译时重命名为 src.hpp
)冲突,由于 OJ 的异步机制,参与编译的会是这二者中完成较慢的那个,造成评测结果不确定。
在复制助教指定的辅助编译文件时,我们加入了冲突检查,当发现已经有同名文件时,会放弃编译,并显示为 Compile Error。
除此以外,之前还有一个问题,编译时助教指定的文件是先复制到评测目录的,而 Git 不允许将仓库复制到一个非空目录下,因此 Git 提交无法加入助教指定的文件进行编译。
我们引入了编译时的准备阶段,使得 Git 仓库会在复制指定文件之前完成,这样就解决了之前的问题。因此,现在助教可以让用户提交 Git,并加入自己提供的文件进行编译,不过需要提醒用户注意避免让这个文件和用户的仓库冲突(冲突了就会报 Compile Error)。
增加 Bad Problem 错误状态
由于评测逻辑中,使用助教提供的特别评测程序 (spj) 与正常的比较程序是同一阶段,而这个阶段本身是给一些不太可能出错的程序(如 diff)做的,因此一旦这些程序出错,我们会标记为 System Error。
然而,助教提供的特别评测程序就没那么可靠了,但是由于显示的是 System Error,所以有时用户并不能发现这其实是助教提供的程序产生的问题。
所以,我们引入了新的评测错误:Bad Problem,来表示题目数据错误。这意味着题目配置有误,无法完成评测,请联系助教处理。
如果管理员在出题过程中遇到此错误,请检查题目数据包。
支持导出作业、比赛、考试的提交数据
现在管理员可以在作业、比赛、考试的管理界面导出所有正式选手在比赛中提交的代码。
导出的代码为每个学生每道题目符合作业要求(包括时间范围和提交语言)的最晚一次最高分提交。例如,四次提交得分分别为 40、80、80、60,则将导出第三次提交的代码。
此功能会使用较多的服务器资源,敬请各位管理员不要频繁进行导出。
已经支持的操作有:修改比赛名称、修改比赛起始/结束时间、修改比赛类型、修改题目、选择是否显示排名、选择是否计算罚时、选择是否计算部分分。 ↩︎
见仓库的这个 issue: https://github.com/ACMClassOJ/TesutoHime/issues/29 ↩︎