示例#1
0
        protected void JudgeAllCases(BaseSingleCaseJudger judger, ProgramTestDataFile[] dataFiles)
        {
            JudgeResult result             = JudgeResult;
            int         acceptedCasesCount = 0;

            foreach (var dataFile in dataFiles)
            {
                try
                {
                    ProgramTestData   testData     = TestDataManager.GetTestData(JudgeTask.ProblemId, dataFile);
                    SingleJudgeResult singleResult = judger.Judge(testData.Input, testData.Output);

                    if (result.ResultCode == JudgeResultCode.Accepted)
                    {
                        // 计算有时间补偿的总时间
                        result.TimeCost =
                            Math.Max(result.TimeCost, (int)(singleResult.TimeCost * LangConfig.TimeCompensation));
                        result.MemoryCost = Math.Max(result.MemoryCost, singleResult.MemoryCost);
                    }

                    if (singleResult.ResultCode == JudgeResultCode.Accepted)
                    {
                        acceptedCasesCount++;
                    }
                    else
                    {
                        // 出错时只记录第一组出错的信息
                        if (result.ResultCode == JudgeResultCode.Accepted)
                        {
                            result.ResultCode  = singleResult.ResultCode;
                            result.JudgeDetail = singleResult.JudgeDetail;
                        }

                        if (!JudgeTask.JudgeAllCases)
                        {
                            break;
                        }
                    }
                }
                catch (Exception e)
                {
                    result.ResultCode  = JudgeResultCode.JudgeFailed;
                    result.JudgeDetail = e.ToString();
                    throw new ExpectedJudgeStopException("Judge failed");
                }
            }

            result.JudgeDetail = result.JudgeDetail.Replace(Context.TempDirectory, "");
            result.PassRate    = (double)acceptedCasesCount / dataFiles.Length;
        }
示例#2
0
        private SingleJudgeResult JudgeOneCase(string dataName)
        {
            DbTestData testData = TestDataManager.GetDbTestData(JudgeTask.ProblemId, _dbType, dataName);

            BuildStandardData(testData, out string inputData, out DbData outputData, out DbQueryData queryData);

            BaseDbOperator userOper = CreateJudgeEnv(inputData);

            SingleCaseJudger  singleCaseJudger = new SingleCaseJudger(Context, userOper);
            SingleJudgeResult result           = singleCaseJudger.Judge(inputData, outputData, queryData);

            ClearJudgeEnv(userOper);

            return(result);
        }
示例#3
0
        public override void Judge()
        {
            JudgeResult result = JudgeResult;

            string[] dataNames = TestDataManager.GetDbTestDataNames(JudgeTask.ProblemId, _dbType);
            if (dataNames.Length == 0)
            {
                result.ResultCode  = JudgeResultCode.JudgeFailed;
                result.JudgeDetail = "No test data.";
                return;
            }

            int acceptedCount = 0;

            foreach (string dataName in dataNames)
            {
                SingleJudgeResult singleResult = JudgeOneCase(dataName);
                result.TimeCost = Math.Max(result.TimeCost, singleResult.TimeCost);

                if (singleResult.ResultCode == JudgeResultCode.Accepted)
                {
                    acceptedCount++;
                }
                else
                {
                    result.ResultCode  = singleResult.ResultCode;
                    result.JudgeDetail = singleResult.JudgeDetail;

                    if (!JudgeTask.JudgeAllCases)
                    {
                        break;
                    }
                }
            }

            result.PassRate = (double)acceptedCount / dataNames.Length;
        }
示例#4
0
        public override void Judge()
        {
            //判题结果
            JudgeResult result = Context.Result;

            //正则恶意代码检查
            if (!CodeChecker.Singleton.CheckCode(JudgeTask.SourceCode, JudgeTask.Language, out string unsafeCode,
                                                 out int line))
            {
                result.ResultCode   = JudgeResultCode.CompileError;
                result.JudgeDetail  = "Include unsafe code, please remove them!";
                result.JudgeDetail += "\r\n";
                result.JudgeDetail += "line " + line + ": " + unsafeCode;
                return;
            }

            //写出源代码
            string sourceFileName = Path.Combine(Context.TempDirectory, LangConfig.SourceCodeFileName);

            File.WriteAllText(sourceFileName, JudgeTask.SourceCode);

            //编译代码
            if (LangConfig.NeedCompile)
            {
                Compiler compiler   = new Compiler(Context);
                string   compileRes = compiler.Compile();

                //检查是否有编译错误(compileRes不为空则代表有错误)
                if (!string.IsNullOrEmpty(compileRes))
                {
                    //去除路径信息
                    result.JudgeDetail = compileRes.Replace(Context.TempDirectory, "");
                    result.ResultCode  = JudgeResultCode.CompileError;
                    result.MemoryCost  = 0;
                    return;
                }
            }

            //创建单例Judger
            SingleCaseJudger judger = new SingleCaseJudger(Context);

            //获取所有测试点文件名
            Tuple <string, string>[] dataFiles = TestDataManager.GetTestDataFilesName(JudgeTask.ProblemId);
            if (dataFiles.Length == 0) //无测试数据
            {
                result.ResultCode  = JudgeResultCode.JudgeFailed;
                result.JudgeDetail = "No test data.";
                return;
            }

            int acceptedCasesCount = 0; //通过的测试点数

            for (int i = 0; i < dataFiles.Length; i++)
            {
                try
                {
                    //读入测试数据
                    TestDataManager.GetTestData(
                        JudgeTask.ProblemId, dataFiles[i].Item1, dataFiles[i].Item2,
                        out string input, out string output);

                    SingleJudgeResult singleRes = judger.Judge(input, output); //测试此测试点

                    // 评测所有测试点时, 只记录第一组出错的信息
                    if (result.ResultCode == JudgeResultCode.Accepted)
                    {
                        // 计算有时间补偿的总时间
                        result.TimeCost = Math.Max(result.TimeCost,
                                                   (int)(singleRes.TimeCost * LangConfig.TimeCompensation));
                        result.MemoryCost = Math.Max(result.MemoryCost, singleRes.MemoryCost);
                    }

                    if (singleRes.ResultCode == JudgeResultCode.Accepted)
                    {
                        acceptedCasesCount++;
                    }
                    else
                    {
                        // 出错时记录第一组出错的信息
                        if (result.ResultCode == JudgeResultCode.Accepted)
                        {
                            result.ResultCode  = singleRes.ResultCode;
                            result.JudgeDetail = singleRes.JudgeDetail;
                        }

                        if (!JudgeTask.JudgeAllCases)
                        {
                            break;
                        }
                    }
                }
                catch (Exception e)
                {
                    result.ResultCode  = JudgeResultCode.JudgeFailed;
                    result.JudgeDetail = e.ToString();
                    break;
                }
            }

            //去除目录信息
            result.JudgeDetail = result.JudgeDetail.Replace(Context.TempDirectory, "");

            //通过率
            result.PassRate = (double)acceptedCasesCount / dataFiles.Length;
        }
示例#5
0
        public SingleJudgeResult Judge(string input, string output)
        {
            string         userOutput = "";
            string         userError  = "";
            int            exitcode   = 0;
            RuntimeMonitor monitor;

            using (ProcessRunner runner = new ProcessRunner(RunnerPath, RunnerWorkDirectory, RunnerArgs))
            {
                runner.ProcessorAffinity = ProcessorAffinity;
                monitor = new RuntimeMonitor(runner.Process)//创建监视器
                {
                    TimeLimit      = TimeLimit,
                    TotalTimeLimit = TimeLimit * TOTAL_TIME_LIMIT_TUPLING,
                    MemoryLimit    = MemoryLimit
                };
                monitor.Start();

                runner.OutputLimit = OutputLimit;
                exitcode           = runner.Run(input, out userOutput, out userError, ProcessPriorityClass.RealTime);
                monitor.Dispose();
            }

            SingleJudgeResult result = new SingleJudgeResult
            {
                TimeCost    = monitor.TimeCost,
                MemoryCost  = monitor.MemoryCost,
                JudgeDetail = userError,
                ResultCode  = JudgeResultCode.Accepted
            };

            if ((userOutput.Length >= OutputLimit || userError.Length >= OutputLimit))
            {
                result.ResultCode = JudgeResultCode.OutputLimitExceed;
                return(result);
            }

            if (monitor.LimitExceed)
            {
                result.ResultCode = (TimeLimit == monitor.TimeCost) ? JudgeResultCode.TimeLimitExceed : JudgeResultCode.MemoryLimitExceed;
                return(result);
            }

            if (exitcode != 0)//判断是否运行错误
            {
                result.ResultCode = JudgeResultCode.RuntimeError;
                return(result);
            }

            CompareResult cmpResult = CompareAnswer(output, userOutput);//对比答案输出

            if (cmpResult == CompareResult.Accepted)
            {
                result.ResultCode = JudgeResultCode.Accepted;
            }
            else if (cmpResult == CompareResult.PresentationError)
            {
                result.ResultCode = JudgeResultCode.PresentationError;
            }
            else
            {
                result.ResultCode = JudgeResultCode.WrongAnswer;
            }

            return(result);
        }
        public SingleJudgeResult Judge(string input, string output)
        {
            string         userOutput = "";
            string         userError  = "";
            int            exitCode   = 0;
            RuntimeMonitor monitor;

            using (ProcessRunner runner = CreateProcessRunner())
            {
                runner.ProcessorAffinity = JudgeTask.ProcessorAffinity;
                if (LangConfig.UseUtf8)
                {
                    runner.Encoding = Encoding.UTF8;
                }

                // 创建监视器
                int totalTimeLimit = Math.Max(JudgeTask.TimeLimit * TOTAL_TIME_LIMIT_RATIO, MIN_TOTAL_TIME_LIMIT);
                monitor = new RuntimeMonitor(runner.Process, ConfigManager.Config.MonitorInterval,
                                             LangConfig.RunningInVm)
                {
                    TimeLimit      = JudgeTask.TimeLimit,
                    TotalTimeLimit = totalTimeLimit,
                    MemoryLimit    = JudgeTask.MemoryLimit
                };
                monitor.Start();

                runner.OutputLimit = LangConfig.OutputLimit;
                exitCode           = runner.Run(input, out userOutput, out userError,
                                                ProcessPriorityClass.RealTime, ConfigManager.Config.MonitorInterval * 2);

                monitor.Dispose();
            }

            SingleJudgeResult result = new SingleJudgeResult
            {
                TimeCost    = monitor.TimeCost,
                MemoryCost  = monitor.MemoryCost,
                JudgeDetail = userError,
                ResultCode  = JudgeResultCode.Accepted
            };

            if (userOutput.Length >= LangConfig.OutputLimit ||
                userError.Length >= LangConfig.OutputLimit)
            {
                result.ResultCode = JudgeResultCode.OutputLimitExceed;
                return(result);
            }

            if (monitor.LimitExceed)
            {
                result.ResultCode = JudgeTask.TimeLimit == monitor.TimeCost
                    ? JudgeResultCode.TimeLimitExceed
                    : JudgeResultCode.MemoryLimitExceed;
                return(result);
            }

            if (exitCode != 0) // 判断是否运行错误
            {
                result.ResultCode = JudgeResultCode.RuntimeError;
                return(result);
            }

            CompareResult cmpResult = CompareAnswer(output, userOutput); // 对比答案输出

            if (cmpResult == CompareResult.Accepted)
            {
                result.ResultCode = JudgeResultCode.Accepted;
            }
            else if (cmpResult == CompareResult.PresentationError)
            {
                result.ResultCode = JudgeResultCode.PresentationError;
            }
            else
            {
                result.ResultCode = JudgeResultCode.WrongAnswer;
            }

            return(result);
        }
示例#7
0
        public override void Judge()
        {
            JudgeResult result = Context.Result;

            if (!CodeChecker.Instance.CheckCode(
                    JudgeTask.SourceCode, JudgeTask.Language,
                    out string unsafeCode, out int line))
            {
                result.ResultCode   = JudgeResultCode.CompileError;
                result.JudgeDetail  = "Include unsafe code, please remove them!";
                result.JudgeDetail += "\r\n";
                result.JudgeDetail += "line " + line + ": " + unsafeCode;
                return;
            }

            // 构建SPJ程序
            BuildSpecialJudgeProgram();

            string sourceFileName = Path.Combine(Context.TempDirectory + LangConfig.SourceCodeFileName);

            File.WriteAllText(sourceFileName, JudgeTask.SourceCode);

            if (LangConfig.NeedCompile)
            {
                Compiler compiler   = new Compiler(Context);
                string   compileRes = compiler.Compile();

                if (!string.IsNullOrEmpty(compileRes))
                {
                    // 去除路径信息
                    result.JudgeDetail = compileRes.Replace(Context.TempDirectory, "");
                    result.ResultCode  = JudgeResultCode.CompileError;
                    result.MemoryCost  = 0;
                    return;
                }
            }

            SpecialSingleCaseJudger judger = new SpecialSingleCaseJudger(Context, SpjContext);

            ProgramTestDataFile[] dataFiles = TestDataManager.GetTestDataFilesName(JudgeTask.ProblemId);
            if (dataFiles.Length == 0)
            {
                result.ResultCode  = JudgeResultCode.JudgeFailed;
                result.JudgeDetail = "No test data.";
                return;
            }

            int acceptedCasesCount = 0;

            for (int i = 0; i < dataFiles.Length; i++)
            {
                try
                {
                    ProgramTestData data = TestDataManager.GetTestData(JudgeTask.ProblemId, dataFiles[i]);

                    SingleJudgeResult singleRes = judger.Judge(data.Input, data.Output);

                    if (result.ResultCode == JudgeResultCode.Accepted)
                    {
                        result.TimeCost = Math.Max(result.TimeCost,
                                                   (int)(singleRes.TimeCost * LangConfig.TimeCompensation));
                        result.MemoryCost = Math.Max(result.MemoryCost, singleRes.MemoryCost);
                    }

                    if (singleRes.ResultCode == JudgeResultCode.Accepted)
                    {
                        acceptedCasesCount++;
                    }
                    else
                    {
                        if (result.ResultCode == JudgeResultCode.Accepted)
                        {
                            result.ResultCode  = singleRes.ResultCode;
                            result.JudgeDetail = singleRes.JudgeDetail;
                        }

                        if (!JudgeTask.JudgeAllCases)
                        {
                            break;
                        }
                    }
                }
                catch (Exception e)
                {
                    result.ResultCode  = JudgeResultCode.JudgeFailed;
                    result.JudgeDetail = e.ToString();
                    break;
                }
            }

            result.JudgeDetail = result.JudgeDetail.Replace(Context.TempDirectory, "");
            result.PassRate    = (double)acceptedCasesCount / dataFiles.Length;
        }
示例#8
0
        /// <summary>
        /// 评测此任务
        /// </summary>
        /// <returns>评测结果</returns>
        public JudgeResult Judge()
        {
            //判题结果
            JudgeResult result = new JudgeResult
            {
                SubmitID    = JudgeTask.SubmitID,
                ProblemID   = JudgeTask.ProblemID,
                Author      = JudgeTask.Author,
                JudgeDetail = "",
                MemoryCost  = 0,
                TimeCost    = 0,
                PassRate    = 0,
                ResultCode  = JudgeResultCode.Accepted
            };

            //正则恶意代码检查
            if (!CodeChecker.Singleton.CheckCode(JudgeTask.SourceCode, JudgeTask.Language, out string unsafeCode, out int line))
            {
                result.ResultCode   = JudgeResultCode.CompileError;
                result.JudgeDetail  = "Include unsafe code, please remove them!";
                result.JudgeDetail += "\r\n";
                result.JudgeDetail += "line " + line + ": " + unsafeCode;
                return(result);
            }

            //创建临时目录
            if (!Directory.Exists(JudgeTask.TempJudgeDirectory))
            {
                Directory.CreateDirectory(JudgeTask.TempJudgeDirectory);
            }

            //写出源代码
            string sourceFileName = JudgeTask.TempJudgeDirectory + Path.DirectorySeparatorChar + JudgeTask.LangConfig.SourceCodeFileName;

            File.WriteAllText(sourceFileName, JudgeTask.SourceCode);

            //编译代码
            if (JudgeTask.LangConfig.NeedCompile)
            {
                ICompiler compiler = CompilerFactory.Create(JudgeTask);
                //使用分配的独立处理器核心
                compiler.ProcessorAffinity = _affinity.Affinity;

                string compileRes = compiler.Compile(JudgeTask.LangConfig.CompilerArgs);

                //检查是否有编译错误(compileRes不为空则代表有错误)
                if (!string.IsNullOrEmpty(compileRes))
                {
                    result.JudgeDetail = compileRes.Replace(JudgeTask.TempJudgeDirectory, "");//去除路径信息
                    result.ResultCode  = JudgeResultCode.CompileError;
                    return(result);
                }
            }


            //创建单例Judger
            ISingleJudger judger = SingleJudgerFactory.Create(JudgeTask);

            judger.ProcessorAffinity = _affinity.Affinity;

            //获取所有测试点文件名
            Tuple <string, string>[] dataFiles = TestDataManager.GetTestDataFilesName(JudgeTask.ProblemID);
            if (dataFiles.Length == 0)//无测试数据
            {
                result.ResultCode  = JudgeResultCode.JudgeFailed;
                result.JudgeDetail = "No test data.";
                return(result);
            }

            int acceptedCasesCount = 0;//通过的测试点数

            for (int i = 0; i < dataFiles.Length; i++)
            {
                try
                {
                    TestDataManager.GetTestData(JudgeTask.ProblemID, dataFiles[i].Item1, dataFiles[i].Item2, out string input, out string output); //读入测试数据

                    SingleJudgeResult singleRes = judger.Judge(input, output);                                                                     //测试此测试点

                    //计算有时间补偿的总时间
                    result.TimeCost   = Math.Max(result.TimeCost, (int)(singleRes.TimeCost * JudgeTask.LangConfig.TimeCompensation));
                    result.MemoryCost = Math.Max(result.MemoryCost, singleRes.MemoryCost);

                    if (singleRes.ResultCode == JudgeResultCode.Accepted)
                    {
                        acceptedCasesCount++;
                    }
                    else
                    {
                        result.ResultCode  = singleRes.ResultCode;
                        result.JudgeDetail = singleRes.JudgeDetail;
                        break;
                    }
                }
                catch (Exception e)
                {
                    result.ResultCode  = JudgeResultCode.JudgeFailed;
                    result.JudgeDetail = e.ToString();
                    break;
                }
            }

            //去除目录信息
            result.JudgeDetail = result.JudgeDetail.Replace(JudgeTask.TempJudgeDirectory, "");

            //通过率
            result.PassRate = (double)acceptedCasesCount / dataFiles.Length;

            return(result);
        }