创建自定义检查器

Last updated: July 9, 2026

自定义检查器代码由三个部分组成。两个不可编辑的部分被称为头部和尾部部分。可编辑的自定义检查器部分称为主体部分。主体部分有一个名为 run_custom_checker() 的方法。该方法接受两个参数:一个 TestStructure 对象和一个 ResultStructure 对象。此方法在候选人提交后执行。每个测试用例评估候选人的提交结果。

image.png

测试结构

testcase_id

[int] 测试用例的ID

testcase_input_path

[str] 测试用例输入文件路径

testcase_output_path

[str] 由问题解决者生成的测试用例输出文件路径

testcase_expected_output_path

[str] 预期输出文件路径,用于匹配

metadata_file_paths

[list<str>] 题目元数据文件路径(通常用于定义训练集的额外文件)

submission_code_path

[str] 提交源代码文件路径

testcase_result

[bool] 如果测试用例输出与预期输出匹配,则设置为True。逐行匹配

testcase_signal

[int] 测试用例进程的退出代码

testcase_time

[float] 测试用例进程所用时间(秒)

testcase_memory

[int] 测试用例进程的峰值内存(以字节为单位)

data

[str] <未来用途>

结果结构

result

[bool]  分配测试用例结果。True表示成功。False表示失败

score

[float] 分配测试用例得分。归一化在0到1之间

message

[str] 分配测试用例消息。此消息对问题解决者可见。

 测试用例结果由设置ResultStructure对象的值来确定。

  1. 结果:如果达到最低截止分数,则将其设置为True,否则为False。这决定了你是否通过了这个测试用例。

  2. 得分:这是一个归一化的得分,用户可以获取总得分,0.5表示一半的得分。

  3. 消息:这是一个可自定义的消息,可以用来传达关于测试用例结果的信息,例如“未通过,因为未达到截止线”。

注意: 请不要在run_custom_checker函数中向STDOUT打印任何内容。 

用于100以下5个素数列表的自定义检查器

import re
# 判断给定整数是否为素数的函数def is_prime_number(x):
if x >= 2:
for y in range(2, x):
if not x % y:
return False
else:
return False
return True

def run_custom_checker(t_obj, r_obj):
result_data = ''
try:
result_data = open(t_obj.testcase_output_path, 'r').read()
except IOError:
r_obj.result = False
r_obj.score = 0
r_obj.message = '读取结果文件出错'
return

# 读取结果文件内容
values = re.split(' |\n', result_data)

# 确保所有值唯一
uniq_values = set(values)

# 计算素数个数
correct_values = 0
for value in uniq_values:
if value and is_prime_number(int(value)):
correct_values = correct_values + 1

# 截止分数以确定是否成功
if correct_values > 3:
r_obj.result = True
else:
r_obj.result = False
r_obj.score = correct_values / 5
r_obj.message = str(correct_values) + '个值中有' + str(correct_values) + '个是正确的'

结果

这里有一个类似的Java自定义检查器 -https://gist.github.com/patilarpith/7b17b5afb9218f770ebc528747017d25

评分近似解题问题

近似解题问题会根据自定义检查器自动评分。它们的评分方式类似于没有自定义检查器的编码题,使用测试用例来确定最终得分。题目设置者为编码题定义了带有输入输出对的单个测试用例。每个测试用例都有一个分数,所有测试用例的总分为所有测试用例得分的总和。当使用自定义检查器时,它会为每个测试用例运行一次。在测试过程中,候选人的代码会用每个测试用例的输入进行测试。自定义检查器会评估并评分每个测试用例;候选人的最终得分是这些得分的总和。

相关文章: