很久之前接触到洛谷,pta,牛客,力扣的时候就想自己实现一个在线评测平台,如果不出意外,可能我的毕设会是一个基于容器的分布式在线评测系统。
今天尝试一下做一个最简单的cpp评测机,使用 C# 做了简单的gcc脚本评测,当然这个简易的评测脚本只支持AC(通过),WA(错误),CE(编译失败)这三种状态。
using System.Diagnostics;
class Judger
{
static void Main(string[] args)
{
// 获取命令行参数
string sourcePath = args[0]; // 源代码文件路径
string inputPath = args[1]; // 测试数据输入路径
string answerPath = args[2]; // 答案文件路径
// 编译源代码文件
string executablePath = sourcePath.Replace(".c", "");
ProcessStartInfo psi = new ProcessStartInfo("g++", $"{sourcePath} -o {executablePath} -O2 -Wall -lm")
{
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false
};
Process process = new Process();
process.StartInfo = psi;
process.Start();
// 等待编译完成
process.WaitForExit();
// 如果编译失败,则输出错误信息
if (process.ExitCode != 0)
{
Console.WriteLine("编译错误:");
Console.WriteLine(process.StandardError.ReadToEnd());
return;
}
// 读入测试数据和答案
string inputData = File.ReadAllText(inputPath);
string answer = File.ReadAllText(answerPath);
// 运行程序
psi = new ProcessStartInfo(executablePath)
{
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false
};
process = new Process();
process.StartInfo = psi;
process.Start();
// 向程序输入测试数据
process.StandardInput.Write(inputData);
process.StandardInput.Close();
// 读取程序输出和错误信息
string output = process.StandardOutput.ReadToEnd();
string error = process.StandardError.ReadToEnd();
// 等待程序退出
process.WaitForExit();
// 比较程序输出和答案
Console.WriteLine(output.Trim() == answer.Trim() ? "AC" : "WA");
// 输出程序错误信息
if (error.Length > 0)
{
Console.WriteLine("Error:");
Console.WriteLine(error);
}
}
}
发表回复