예제 #1
0
        private static void WriteResultFile(VirtualJudgeResult result)
        {
            File.WriteAllText("result.json", JsonConvert.SerializeObject(result));
            var returnFiles = new[] { "result.json" };

            File.WriteAllText("return.json", JsonConvert.SerializeObject(new { Outputs = returnFiles }));
        }
예제 #2
0
        private static async Task <VirtualJudgeResult> PollResultAsync(string problemName, int submissionId)
        {
            var checkUri = checkEndpoint.Replace("{SUBMISSION-ID}", submissionId.ToString());
            var checkReq = new HttpRequestMessage(HttpMethod.Get, checkUri);

            DecorateCSRFRequest(checkReq, problemName, checkUri);
            var checkRes = await client.GetAsync(checkUri);

            var pollRes = new VirtualJudgeResult
            {
                Result = "WAITING"
            };

            if (checkRes.StatusCode != System.Net.HttpStatusCode.OK)
            {
                return(pollRes);
            }
            var resJson = await checkRes.Content.ReadAsStringAsync();

            var result = JsonConvert.DeserializeObject <SubmissionStatus>(resJson);

            if (result.state == "SUCCESS")
            {
                int          totalCorrect = result.total_correct.GetValueOrDefault(0);
                int          testcases    = result.total_testcases.GetValueOrDefault(0);
                const string ACCEPTED     = "Accepted";
                pollRes.Result = result.status_msg;
                switch (result.status_code)
                {
                case 10:     // Suuccess
                    pollRes.Result       = ACCEPTED;
                    pollRes.TimeUsedInMs = Convert.ToInt64(result.status_runtime.Replace(" ms", ""));
                    break;

                case 20:     // Compile Error
                    pollRes.Hint   = result.compile_error;
                    pollRes.Result = "CompileError";
                    break;

                case 11:     // Wrong Answer
                    pollRes.Hint   = $"Input: \n```\n{result.input}\n``` \n\n Output: \n```\n{result.code_output}\n``` \n\n Expected:{result.expected_output}";
                    pollRes.Result = "WrongAnswer";
                    break;

                case 14:     // Time Limit Exceeded
                    pollRes.Hint   = $"Last executed input: {result.last_testcase}";
                    pollRes.Result = "TimeExceeded";
                    break;

                case 15:     // Runtime Error
                    pollRes.Hint   = $"{result.runtime_error} Last test case: {result.last_testcase}";
                    pollRes.Result = "RuntimeError";
                    break;

                default:     // Unknown Error
                    pollRes.Result = "SystemError";
                    pollRes.Hint   = result.status_msg;
                    break;
                    // TODO: more status to be discovered
                }
                if (testcases != 0)
                {
                    var subStatuses = result.compare_result
                                      .ToCharArray()
                                      .Select(c => {
                        return(new VirtualJudgeSubStatus
                        {
                            Result = (c == '1' ? ACCEPTED : pollRes.Result),
                            Hint = (c == '0' ? "LeetCode 仅支持查看最后一个错误信息" : null)
                        });
                    })
                                      .ToArray();
                    var failureIndex = 0;
                    var totalFailed  = result.total_testcases - totalCorrect;
                    for (int i = 0; i < subStatuses.Count(); i++)
                    {
                        var status = subStatuses[i];
                        status.SubId = i + 1;
                        if (status.Result != ACCEPTED)
                        {
                            failureIndex++;
                            if (failureIndex == totalFailed)
                            {
                                status.Hint = pollRes.Hint;
                            }
                        }
                    }
                    pollRes.SubStatuses = subStatuses;
                }
            }
            if (pollRes.SubStatuses != null && pollRes.SubStatuses.Count() != 0)
            {
                pollRes.Hint = null;
            }
            return(pollRes);
        }