1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- 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<String> inputList = judgeContext.getInputList();
- List<String> outputList = judgeContext.getOutputList();
- Question question = judgeContext.getQuestion();
- List<JudgeCase> 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;
- }
- }
|