跳转至

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:查询支持的语言列表

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

评测流程说明

  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 字段。
  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. 评测接口的响应中,需包含实际用时、内存消耗,以及是否超限的状态。
  10. 示例响应字段:
    {
      "status": "TLE",
      "score": 0,
      "time": 1.01,
      "memory": 130
    }
    

评分细则

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