JavaLanguageJudgeStrategy.java 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package com.example.onlinejudge.judge.strategy;
  2. import cn.hutool.json.JSONUtil;
  3. import com.example.onlinejudge.judge.codesandbox.model.JudgeInfo;
  4. import com.example.onlinejudge.model.dto.question.JudgeCase;
  5. import com.example.onlinejudge.model.dto.question.JudgeConfig;
  6. import com.example.onlinejudge.model.entity.Question;
  7. import com.example.onlinejudge.model.enums.JudgeInfoMessageEnum;
  8. import java.util.List;
  9. public class JavaLanguageJudgeStrategy implements JudgeStrategy{
  10. @Override
  11. public JudgeInfo doJudge(JudgeContext judgeContext) {
  12. JudgeInfo judgeInfo = judgeContext.getJudgeInfo();
  13. Long memory = judgeInfo.getMemory();
  14. Long time = judgeInfo.getTime();
  15. List<String> inputList = judgeContext.getInputList();
  16. List<String> outputList = judgeContext.getOutputList();
  17. Question question = judgeContext.getQuestion();
  18. List<JudgeCase> judgeCaseList = judgeContext.getJudgeCaseList();
  19. JudgeInfoMessageEnum judgeInfoMessageEnum = JudgeInfoMessageEnum.ACCEPTED;
  20. JudgeInfo judgeInfoResponse = new JudgeInfo();
  21. judgeInfoResponse.setMemory(memory);
  22. judgeInfoResponse.setTime(time);
  23. // 先判断沙箱执行的结果输出数量是否和预期输出数量相等
  24. if (outputList.size() != inputList.size()) {
  25. judgeInfoMessageEnum = JudgeInfoMessageEnum.WRONG_ANSWER;
  26. judgeInfoResponse.setMessage(judgeInfoMessageEnum.getValue());
  27. return judgeInfoResponse;
  28. }
  29. // 依次判断每一项输出和预期输出是否相等
  30. for (int i = 0; i < judgeCaseList.size(); i++) {
  31. JudgeCase judgeCase = judgeCaseList.get(i);
  32. if (!judgeCase.getOutput().equals(outputList.get(i))) {
  33. judgeInfoMessageEnum = JudgeInfoMessageEnum.WRONG_ANSWER;
  34. judgeInfoResponse.setMessage(judgeInfoMessageEnum.getValue());
  35. return judgeInfoResponse;
  36. }
  37. }
  38. // 判断题目限制
  39. String judgeConfigStr = question.getJudgeConfig();
  40. JudgeConfig judgeConfig = JSONUtil.toBean(judgeConfigStr, JudgeConfig.class);
  41. Long needMemoryLimit = judgeConfig.getMemoryLimit();
  42. Long needTimeLimit = judgeConfig.getTimeLimit();
  43. if (memory > needMemoryLimit) {
  44. judgeInfoMessageEnum = JudgeInfoMessageEnum.MEMORY_LIMIT_EXCEEDED;
  45. judgeInfoResponse.setMessage(judgeInfoMessageEnum.getValue());
  46. return judgeInfoResponse;
  47. }
  48. // Java 程序本身需要额外执行 10 秒钟
  49. long JAVA_PROGRAM_TIME_COST = 10000L;
  50. if ((time - JAVA_PROGRAM_TIME_COST) > needTimeLimit) {
  51. judgeInfoMessageEnum = JudgeInfoMessageEnum.TIME_LIMIT_EXCEEDED;
  52. judgeInfoResponse.setMessage(judgeInfoMessageEnum.getValue());
  53. return judgeInfoResponse;
  54. }
  55. judgeInfoResponse.setMessage(judgeInfoMessageEnum.getValue());
  56. return judgeInfoResponse;
  57. }
  58. }