判题中输出结果的比较去除最后的空行和空格

This commit is contained in:
virusdefender 2015-09-12 20:01:34 +08:00
parent 1dc0e8b742
commit 0c0d4225ca
2 changed files with 25 additions and 7 deletions

View File

@ -1,4 +1,5 @@
# coding=utf-8 # coding=utf-8
import os
import json import json
import commands import commands
import hashlib import hashlib
@ -94,7 +95,8 @@ class JudgeClient(object):
return error, parse_lrun_output(output) return error, parse_lrun_output(output)
def _compare_output(self, test_case_id): def _compare_output(self, test_case_id):
test_case_md5 = self._test_case_info["test_cases"][str(test_case_id)]["output_md5"] test_case_config = self._test_case_info["test_cases"][str(test_case_id)]
test_case_md5 = test_case_config["output_md5"]
output_path = judger_workspace + str(test_case_id) + ".out" output_path = judger_workspace + str(test_case_id) + ".out"
try: try:
@ -104,6 +106,7 @@ class JudgeClient(object):
return False return False
# 计算输出文件的md5 和之前测试用例文件的md5进行比较 # 计算输出文件的md5 和之前测试用例文件的md5进行比较
# 现在比较的是完整的文件
md5 = hashlib.md5() md5 = hashlib.md5()
while True: while True:
data = f.read(2 ** 8) data = f.read(2 ** 8)
@ -111,9 +114,18 @@ class JudgeClient(object):
break break
md5.update(data) md5.update(data)
# 对比文件是否一致 if md5.hexdigest() == test_case_md5:
# todo 去除最后的空行 return True
return md5.hexdigest() == test_case_md5 else:
# 这时候需要去除用户输出最后的空格和换行 再去比较md5
# 兼容之前没有striped_output_md5的测试用例
if "striped_output_md5" not in test_case_config:
return False
f.seek(0)
striped_md5 = hashlib.md5()
# 比较和返回去除空格后的md5比较结果
striped_md5.update(f.read().rstrip())
return striped_md5.hexdigest() == test_case_config["striped_output_md5"]
def _judge_one(self, test_case_id): def _judge_one(self, test_case_id):
# 运行lrun程序 接收返回值 # 运行lrun程序 接收返回值

View File

@ -198,16 +198,24 @@ class TestCaseUploadAPIView(APIView):
# 计算输出文件的md5 # 计算输出文件的md5
for i in range(len(l) / 2): for i in range(len(l) / 2):
md5 = hashlib.md5() md5 = hashlib.md5()
striped_md5 = hashlib.md5()
f = open(test_case_dir + str(i + 1) + ".out", "r") f = open(test_case_dir + str(i + 1) + ".out", "r")
# 完整文件的md5
while True: while True:
data = f.read(2 ** 8) data = f.read()
if not data: if not data:
break break
md5.update(data) md5.update(data)
# 删除标准输出最后的空格和换行
# 这时只能一次全部读入了,分块读的话,没办法确定文件结尾
f.seek(0)
striped_md5.update(f.read().rstrip())
file_info["test_cases"][str(i + 1)] = {"input_name": str(i + 1) + ".in", file_info["test_cases"][str(i + 1)] = {"input_name": str(i + 1) + ".in",
"output_name": str(i + 1) + ".out", "output_name": str(i + 1) + ".out",
"output_md5": md5.hexdigest(), "output_md5": md5.hexdigest(),
"striped_output_md5": striped_md5.hexdigest(),
"output_size": os.path.getsize(test_case_dir + str(i + 1) + ".out")} "output_size": os.path.getsize(test_case_dir + str(i + 1) + ".out")}
# 写入配置文件 # 写入配置文件
open(test_case_dir + "info", "w").write(json.dumps(file_info)) open(test_case_dir + "info", "w").write(json.dumps(file_info))
@ -239,8 +247,6 @@ def problem_list_page(request, page=1):
else: else:
difficulty_order = "difficulty" difficulty_order = "difficulty"
# 按照标签筛选 # 按照标签筛选
tag_text = request.GET.get("tag", None) tag_text = request.GET.get("tag", None)
if tag_text: if tag_text: