Step2:题目评测
模块目标¶
本模块将实现 OJ 题目的自动化评测。你需要从题库读取题目信息,接收用户提交的代码,自动运行并比对输出,返回结构化的评测结果。要求至少支持 Python 语言,进一步扩展支持 C++ 等多语言。
题目输入输出规范¶
与大一程设课类似,OJ 评测对输入输出格式有严格要求。以 P1001 A+B Problem 为例:
- 输入:一行,包含两个整数 a 和 b,空格分隔。
- 输出:一行,输出 a+b 的结果。
注意事项: - 不允许有多余提示语(如"请输入...")。 - 输出末尾允许有换行,评测时会忽略多余的行末空格和最后一行多余换行。 - 输入输出必须严格匹配样例格式。
输入样例:
1 2
3
任务分解¶
任务 1:支持 Python 评测¶
- 实现评测流程:自动读取题库中的样例输入输出,将输入传递给用户提交的 Python 代码,捕获输出并与标准答案比对。
- 返回结构化评测结果(如 AC/WA/RE/TLE),并保证评测过程安全、资源受控。
如何评测一个任务?
设想一下你在运行一段 python 代码,你需要先将代码保存至一个文件(如
test.py
),然后调用python test.py
,在命令行阅读代码输出结果。现在同理,你只需要调用subprocess
模块,将本该输出到命令行的结果捕获到变量中,与预期输出比对即可。
任务 2:支持多语言评测¶
本任务仅需额外实现 C++ 语言
- 在 Python 评测基础上,扩展支持 C++ 等其他语言。
- 需根据
language
字段自动选择编译/运行命令,C++ 需先编译再运行。 - 设计良好的语言配置与切换机制,便于后续扩展。
任务 3:动态注册新语言¶
- 支持管理员动态注册新语言,便于系统扩展。
任务 4:查询支持的语言列表¶
- 支持查询当前系统支持的所有编程语言。
评测流程说明¶
- 读取题目信息:根据题目 id 获取输入输出样例和限制条件。
- 接收用户代码:获取用户提交的代码及语言类型。
- 运行与比对:将样例输入传递给用户代码,捕获输出并与标准答案比对。
- 返回结果:以结构化方式返回评测状态、得分、时间、内存等信息。
时间与内存限制要求¶
- 每道题目都应有 time limit(如 1 秒)和 memory limit(如 128MB)字段。
- 评测时,系统必须对用户代码的运行时间和内存消耗进行限制和监控。
- 超出限制时,评测结果应返回 TLE(Time Limit Exceeded,超时)或 MLE(Memory Limit Exceeded,超内存)。
具体要求¶
- 题目配置
- 在题目 JSON 或数据库结构中,必须包含
time_limit
和memory_limit
字段。 - 示例:
{ "id": "P1001", "title": "A+B Problem", ... "time_limit": 1.0, "memory_limit": 128 }
- 评测实现
- 评测时,自动读取题目的时间和内存限制。
- 运行用户代码时,必须设置相应的资源限制(如 Python 的 resource、subprocess,或 Linux ulimit)。
- 若用户代码超时或超内存,应立即终止进程,并返回对应的评测状态(TLE/MLE)。
- 评测结果
- 评测接口的响应中,需包含实际用时、内存消耗,以及是否超限的状态。
- 示例响应字段:
{ "status": "TLE", "score": 0, "time": 1.01, "memory": 130 }
评分细则¶
功能/接口 | 分值 | 评分说明 |
---|---|---|
多语言评测支持 | 2 | 评测流程支持多语言 |
动态注册新语言 | 1 | 支持动态注册、配置安全 |
查询支持语言列表 | 1 | 支持查询所有已注册语言 |
时间/内存限制实现 | 1 | 能正确限制并判定超时/超内存 |
小计 | 5 |
作者: