示例#1
0
        public async Task <string> createSubmissionWithInputAsync(SubmissionWithInput httpBody)
        {
            httpBody.source_code = httpBody.source_code.Replace('"', '\"');

            string     URI        = "https://api.judge0.com/submissions/?base64_encoded=false&wait=false";
            HttpClient httpClient = new HttpClient();


            HttpResponseMessage submissionResponse = await httpClient.PostAsJsonAsync(URI, httpBody);

            var content = submissionResponse.Content.ReadAsStringAsync();

            JsonSerializer serializer     = new JsonSerializer();
            SolutionResult solutionResult = serializer.Deserialize <SolutionResult>(new JsonTextReader(new StringReader(content.Result)));

            string token = solutionResult.token;

            return(token);
        }
示例#2
0
        private string Judge(JsonAfterCompilationResult submissionResult, AlgorithmTask task, SubmissionWithInput submission)
        {
            string verdict = "";
            string stdout;

            stdout = submissionResult.stdout.Replace("\n", "");
            foreach (var data in task.VerificationData)
            {
                if (submissionResult.stderr != null)
                {
                    verdict = Verdicts.CompilationError.ToString();
                }
                if (submissionResult.stderr != null)
                {
                    verdict = Verdicts.RuntimeError.ToString();
                }

                else if (Convert.ToDecimal(submissionResult.time) > task.TimeLimit)
                {
                    verdict = Verdicts.TimeLimitExceeded.ToString();
                }
                else if (submissionResult.memory > task.MemoryLimit)
                {
                    verdict = Verdicts.MemoryLimitExceeded.ToString();
                }
                else if (submission.stdin == data.InputData && stdout == data.OutputData)
                {
                    verdict = Verdicts.Accepted.ToString();
                    var metrics = _codeAnalyzeService.GetMetricsAsync(submission.source_code);
                }
                else if (submission.stdin == data.InputData && stdout != data.OutputData)
                {
                    verdict = Verdicts.NotAccepted.ToString();
                }
                else if (stdout != data.OutputData)
                {
                    verdict = Verdicts.NotAccepted.ToString();
                }
                else if (stdout == data.OutputData)
                {
                    verdict = Verdicts.Accepted.ToString();
                }
            }
            return(verdict);
        }
示例#3
0
        public async Task <VerdictName> JudgeSolution(SubmissionWithInput submission)
        {
            int         verdictId;
            bool        isPlagiat;
            string      submissionToken;
            Verdict     verdict     = new Verdict();
            VerdictName verdictName = new VerdictName();

            var task = await _repository.GetAlgorithmTasksForSolveAsync(submission.algorithmTaskId);



            if (submission.stdin != "")
            {
                submissionToken = await createSubmissionWithInputAsync(submission);
            }
            else
            {
                Submission submissionWithNoInput = new Submission();
                submissionWithNoInput.language_id = submission.language_id;
                submissionWithNoInput.source_code = submission.source_code;
                submissionToken = await createSubmissionAsync(submissionWithNoInput);
            }

            JsonCompilationResult result;

            result = await GetResultAsync(submissionToken);

            while (result.stdout == null && result.compile_output == null)
            {
                result = await GetResultAsync(submissionToken);
            }
            if (result.compile_output != null)
            {
                verdictName.Verdict       = Verdicts.CompilationError.ToString();
                verdict.VerdictName       = verdictName.Verdict;
                verdict.AlgorithmTaskName = submission.algorithmTaskName;
                verdict.Solution          = submission.source_code;
                verdict.UserId            = submission.userId;
                verdict.AlgorithmTaskId   = task.Id;
                verdict.IsCopied          = null;
                verdict.SimilarTaskId     = null;
                await _verdictRepository.AddVerdictAsync(verdict);
            }
            else
            {
                JsonAfterCompilationResult submissionResult = await GetFinalResultAsync(submissionToken);

                string time = submissionResult.time.Replace(".", ",");
                submissionResult.time = time;

                verdictName.Verdict = Judge(submissionResult, task, submission);
                var copyResult = await AnalyzeSolutionCopyRatio(submission.source_code, submission.algorithmTaskId);

                if (copyResult.Count >= 1)
                {
                    isPlagiat = true;
                }
                else
                {
                    isPlagiat = false;
                }
                var metrics = _codeAnalyzeService.GetMetricsAsync(submission.source_code);

                // verdict.VerdictName = verdictName.Verdict;
                verdict.Solution          = submission.source_code;
                verdict.AlgorithmTaskName = submission.algorithmTaskName;
                verdict.Time                 = Convert.ToDecimal(time);
                verdict.Memory               = Convert.ToDecimal(submissionResult.memory);
                verdict.LinesOfCode          = metrics.LinesOfCode;
                verdict.CyclomaticComplexity = metrics.CyclomaticComplexity;
                verdict.NumberOfDecision     = metrics.NumberOfDecision;
                verdict.NumberOfAssignment   = metrics.NumberOfAssignment;
                verdict.UserId               = submission.userId;
                verdict.AlgorithmTaskId      = task.Id;

                // nadanie werdyktu plagiat
                if (isPlagiat == true)
                {
                    verdict.IsCopied    = 1;
                    verdict.VerdictName = "Plagiat";
                    var mappedVerdict = _mapper.Map <VerdictAddDTO>(verdict);
                    verdictId = await _verdictService.AddVerdictAsync(mappedVerdict);
                }
                else
                {
                    verdict.IsCopied    = 0;
                    verdict.VerdictName = verdictName.Verdict;
                    var mappedVerdict = _mapper.Map <VerdictAddDTO>(verdict);
                    verdictId = await _verdictService.AddVerdictAsync(mappedVerdict);
                }
                // dodanie informacji o pracach które są podobne do tej pracy
                foreach (var copy in copyResult)
                {
                    copy.VerdictId = verdictId;

                    var mappedCopy = _mapper.Map <CopiedSolution>(copy);
                    await _verdictRepository.AddCopySolutionAsync(mappedCopy);
                }

                // if (verdictName.Verdict == "Accepted" || verdictName.Verdict == "Plagiat")
                // {
                var mappedMetrics = _mapper.Map <Metrics>(metrics);
                mappedMetrics.VerdictId = verdictId;
                await _verdictRepository.AddMetricsAsync(mappedMetrics);

                // }
            }
            verdictName.Verdict = verdict.VerdictName;
            return(verdictName);
        }