// コンパイル private string compile(pair file) { string ret = ""; // Processオブジェクトを作成 Process p = new Process(); p.StartInfo.FileName = STARTUP_PATH + @"\compile.bat"; // 出力を読み取れるようにする p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardInput = false; // ウィンドウを表示しないようにする p.StartInfo.CreateNoWindow = true; // コマンドラインを指定 p.StartInfo.Arguments = file.path; // 起動 p.Start(); // プロセス終了まで3s待機する bool status = p.WaitForExit(3000); if (!p.HasExited) { p.Kill(); } // 出力を読み取る string output = p.StandardOutput.ReadToEnd(); p.Close(); if (output.Contains("エラー") || output.ToLower().Contains("error")) { ret = "Compile Error"; } return ret; }
// 実行 private string run(pair file, string caseNum) { string ret = ""; // Processオブジェクトを作成 Process p = new Process(); p.StartInfo.FileName = sourceFilePath + Path.GetFileNameWithoutExtension(file.path) + ".exe"; // 出力を読み取れるようにする p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardError = true; // エラーダイアログを表示しない p.StartInfo.ErrorDialog = false; // ウィンドウを表示しないようにする p.StartInfo.CreateNoWindow = true; // 起動 p.Start(); string input; using (StreamReader sr = new StreamReader(getTestFileName(file.problem, caseNum))) { input = sr.ReadToEnd(); } p.StandardInput.Write(input); // プロセス終了まで5s待機する bool status = p.WaitForExit(5000); if (!p.HasExited) { p.Kill(); } // User時間を測定 TimeSpan ts = p.UserProcessorTime; // 出力を読み取る string output = p.StandardOutput.ReadToEnd(); using (StreamWriter sw = new StreamWriter(getOutFileName(file.index, file.problem, caseNum))) { sw.Write(output); } // エラーの読み取り int exit = p.ExitCode; string error = p.StandardError.ReadToEnd(); p.Close(); if (error != "" || exit != 0) { // Runtime Error ret = "Runtime Error"; } else if (!status) { // Time Limit Exceeded ret = "Time Limit Exceeded"; } if (ts.TotalSeconds >= 2.0) { // User実行時間が2秒以上ならTLE ret = "Time Limit Exceeded"; } return ret; }
// 実行結果の答え合わせ private string check(pair file, string problemNum, string caseNum) { string ret = "Accepted"; Encoding enc = Encoding.GetEncoding("UTF-8"); // 答え string[] ansLines; ansLines = File.ReadAllLines(getAnswerFileName(problemNum, caseNum), enc); // 実行結果 string[] retLines; string retPath = getOutFileName(file.index, problemNum, caseNum); if (!File.Exists(retPath)) { return "Waiting"; } retLines = File.ReadAllLines(retPath, enc); if (ansLines.Length != retLines.Length) { // 行数が違うから間違い ret = "Wrong Answer"; } else { for (int i = 0; i < ansLines.Length; i++) { if (ansLines[i] != retLines[i]) { ret = "Wrong Answer"; break; } } } return ret; }