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 })); }
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); }