package com.example.onlinejudge.judge.strategy; import cn.hutool.json.JSONUtil; import com.example.onlinejudge.judge.codesandbox.model.JudgeInfo; import com.example.onlinejudge.model.dto.question.JudgeCase; import com.example.onlinejudge.model.dto.question.JudgeConfig; import com.example.onlinejudge.model.entity.Question; import com.example.onlinejudge.model.enums.JudgeInfoMessageEnum; import java.util.List; public class DefaultJudgeStrategy implements JudgeStrategy{ @Override public JudgeInfo doJudge(JudgeContext judgeContext) { JudgeInfo judgeInfo = judgeContext.getJudgeInfo(); Long memory = judgeInfo.getMemory(); Long time = judgeInfo.getTime(); List inputList = judgeContext.getInputList(); List outputList = judgeContext.getOutputList(); Question question = judgeContext.getQuestion(); List judgeCaseList = judgeContext.getJudgeCaseList(); JudgeInfoMessageEnum judgeInfoMessageEnum = JudgeInfoMessageEnum.ACCEPTED; JudgeInfo judgeInfoResponse = new JudgeInfo(); judgeInfoResponse.setMemory(memory); judgeInfoResponse.setTime(time); // 先判断沙箱执行的结果输出数量是否和预期输出数量相等 if (outputList.size() != inputList.size()) { judgeInfoMessageEnum = JudgeInfoMessageEnum.WRONG_ANSWER; judgeInfoResponse.setMessage(judgeInfoMessageEnum.getValue()); return judgeInfoResponse; } // 依次判断每一项输出和预期输出是否相等 for (int i = 0; i < judgeCaseList.size(); i++) { JudgeCase judgeCase = judgeCaseList.get(i); if (!judgeCase.getOutput().equals(outputList.get(i))) { judgeInfoMessageEnum = JudgeInfoMessageEnum.WRONG_ANSWER; judgeInfoResponse.setMessage(judgeInfoMessageEnum.getValue()); return judgeInfoResponse; } } // 判断题目限制 String judgeConfigStr = question.getJudgeConfig(); JudgeConfig judgeConfig = JSONUtil.toBean(judgeConfigStr, JudgeConfig.class); Long needMemoryLimit = judgeConfig.getMemoryLimit(); Long needTimeLimit = judgeConfig.getTimeLimit(); if (memory > needMemoryLimit) { judgeInfoMessageEnum = JudgeInfoMessageEnum.MEMORY_LIMIT_EXCEEDED; judgeInfoResponse.setMessage(judgeInfoMessageEnum.getValue()); return judgeInfoResponse; } if (time > needTimeLimit) { judgeInfoMessageEnum = JudgeInfoMessageEnum.TIME_LIMIT_EXCEEDED; judgeInfoResponse.setMessage(judgeInfoMessageEnum.getValue()); return judgeInfoResponse; } judgeInfoResponse.setMessage(judgeInfoMessageEnum.getValue()); return judgeInfoResponse; } }