12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- 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 JavaLanguageJudgeStrategy 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;
- }
- // Java 程序本身需要额外执行 10 秒钟
- long JAVA_PROGRAM_TIME_COST = 10000L;
- if ((time - JAVA_PROGRAM_TIME_COST) > needTimeLimit) {
- judgeInfoMessageEnum = JudgeInfoMessageEnum.TIME_LIMIT_EXCEEDED;
- judgeInfoResponse.setMessage(judgeInfoMessageEnum.getValue());
- return judgeInfoResponse;
- }
- judgeInfoResponse.setMessage(judgeInfoMessageEnum.getValue());
- return judgeInfoResponse;
- }
- }
|