跳转至

Step2:题目评测

模块目标

本模块将实现 OJ 题目的自动化评测。你需要从题库读取题目信息,接收用户提交的代码,自动运行并比对输出,返回结构化的评测结果。要求至少支持 Python 语言,进一步扩展支持 C++ 等多语言。

版本需求

建议 python 使用 3.10 版本;C++ 使用 GCC 9+, C++14 版本


题目输入输出规范

与大一程设课类似,OJ 评测对输入输出格式有严格要求。以 P1001 A+B Problem 为例:

  • 输入:一行,包含两个整数 a 和 b,空格分隔。
  • 输出:一行,输出 a+b 的结果。

注意事项: - 不允许有多余提示语(如"请输入...")。 - 输出末尾允许有换行,评测时会忽略多余的行末空格和最后一行多余换行。 - 输入输出必须严格匹配样例格式。

输入样例:

1 2
输出样例:
3


任务分解

任务 1:支持 Python 评测

  • 实现评测流程:自动读取题库中的样例输入输出,将输入传递给用户提交的 Python 代码,捕获输出并与标准答案比对。
  • 需要实现异步评测,但仅需支持单用户提交任务即可,不要求支持多用户同时提交代码。关于异步实现,你可以参考 asyncio.create_task 这个接口。
  • 返回结构化评测结果(如 AC/WA/RE/TLE)。

测试点结果

你只需要考虑如下测试点结果,如果非 AC ~ CE 状态全部归为 UNK 即可。

状态缩写 全称 含义
AC Accepted Answer 输出正确,程序运行无异常且输出结果与标准答案一致。
WA Wrong Answer 输出错误,程序运行无异常但输出结果与标准答案不一致。
TLE Time Limit Exceeded 超时,程序运行超过了题目规定的时间限制。
MLE Memory Limit Exceeded 内存超限,程序使用内存超过了题目限制。
RE Runtime Error 运行时错误,如除零、数组越界、段错误等。
CE Compilation Error 编译错误,代码无法通过编译。
UNK Unknown Error 未知错误,程序运行过程中发生了未被捕获的异常。

评测状态

对于评测状态,你只需要考虑如下三种。

状态 含义
pending 评测正在进行中
success 评测正常返回结果
error 评测过程出现问题

如何评测一个任务?

设想一下你在运行一段 python 代码,你需要先将代码保存至一个文件(如 test.py),然后调用 python test.py,在命令行阅读代码输出结果。现在同理,你只需要调用 subprocess 模块,将本该输出到命令行的结果捕获到变量中,与预期输出比对即可。

任务 2:支持多语言评测

本任务仅需额外实现 C++ 语言

  • 在 Python 评测基础上,扩展支持 C++ 等其他语言。
  • 需根据 language 字段自动选择编译/运行命令,C++ 需先编译再运行。
  • 设计良好的语言配置与切换机制,便于后续扩展。

任务 3:动态注册新语言

  • 支持已登录用户动态注册新语言,便于系统扩展。

任务 4:查询支持的语言列表

  • 支持查询当前系统支持的所有编程语言。

评测流程说明

  1. 读取题目信息:根据题目 id 获取输入输出样例和限制条件。
  2. 接收用户代码:获取用户提交的代码及语言类型。
  3. 运行与比对:将样例输入传递给用户代码,捕获输出并与标准答案比对。
  4. 返回结果:以结构化方式返回评测状态、得分、时间、内存等信息。

时间与内存限制要求

  • 每道题目都应有 time limit(如 1 秒)和 memory limit(如 128MB)字段。
  • 评测时,系统必须对用户代码的运行时间和内存消耗进行限制和监控。
  • 超出限制时,评测结果应返回 TLE(Time Limit Exceeded,超时)或 MLE(Memory Limit Exceeded,超内存)。

具体要求

  1. 题目配置
  2. 在题目 JSON 或数据库结构中,time_limitmemory_limit 字段可选,如果未设置的话,按照添加语言时的 time_limitmemory_limit 配置。
  3. 示例:
    {
      "id": "P1001",
      "title": "A+B Problem",
      ...
      "time_limit": 1.0,
      "memory_limit": 128
    }
    
  4. 评测实现
  5. 评测时,自动读取题目的时间和内存限制。
  6. 运行用户代码时,必须设置相应的资源限制(如 Python 的 resource、subprocess,或 Linux ulimit)。
  7. 若用户代码超时或超内存,应立即终止进程,并返回对应的评测状态(TLE/MLE)。
  8. 评测结果
  9. 评测接口的响应中,仅需返回最终评测结果即可,具体请参考 api.md。详细测试点状态会在 Step5 中实现。
  10. 认为一个测试点 10 分

评分细则

功能/接口 分值 评分说明
多语言评测支持 2 评测流程支持多语言
动态注册新语言 1 支持动态注册、配置安全
查询支持语言列表 1 支持查询所有已注册语言
时间/内存限制实现 1 能正确限制并判定超时/超内存
小计 5
作者:Haoran Wang