OJ评测机的实现

写在

很久之前接触到洛谷,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);
        }
    }
}

评论

《 “OJ评测机的实现” 》 有 6 条评论

  1. 又是我看不懂的一天

  2. 想到以前校队的OJ,就是学长的毕设,评论好像发不出?

    1. 可以的,评论加了审核,有之前审核通过的评论才会直接显示

      1. 是我点太快了,抱歉~

  3. 想到以前校队的OJ平台,就是学长的毕设。

    1. 哈哈哈哈哈哈,我也想做完给学校用,不过学校现在买的PTA OJ系统太好用了,我这很难达到那种程度

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注