// コンパイル
        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;
        }