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

测试结构
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对象的值来确定。
结果:如果达到最低截止分数,则将其设置为True,否则为False。这决定了你是否通过了这个测试用例。
得分:这是一个归一化的得分,用户可以获取总得分,0.5表示一半的得分。
消息:这是一个可自定义的消息,可以用来传达关于测试用例结果的信息,例如“未通过,因为未达到截止线”。
注意: 请不要在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
评分近似解题问题
近似解题问题会根据自定义检查器自动评分。它们的评分方式类似于没有自定义检查器的编码题,使用测试用例来确定最终得分。题目设置者为编码题定义了带有输入输出对的单个测试用例。每个测试用例都有一个分数,所有测试用例的总分为所有测试用例得分的总和。当使用自定义检查器时,它会为每个测试用例运行一次。在测试过程中,候选人的代码会用每个测试用例的输入进行测试。自定义检查器会评估并评分每个测试用例;候选人的最终得分是这些得分的总和。
相关文章: