From ac67be96e0119c1462b04f2572b0a9021f5bf714 Mon Sep 17 00:00:00 2001 From: undefined Date: Sat, 26 Mar 2022 02:39:30 +0800 Subject: [PATCH] judge: common analysis --- packages/hydrojudge/package.json | 2 +- packages/hydrojudge/src/judge/default.ts | 35 ++++++++++++---------- packages/hydrojudge/src/judge/interface.ts | 1 + packages/hydrojudge/src/judge/run.ts | 14 +++++---- packages/hydrojudge/src/sysinfo.ts | 4 ++- 5 files changed, 33 insertions(+), 23 deletions(-) diff --git a/packages/hydrojudge/package.json b/packages/hydrojudge/package.json index ad7cca27e..031b8e888 100644 --- a/packages/hydrojudge/package.json +++ b/packages/hydrojudge/package.json @@ -1,7 +1,7 @@ { "name": "@hydrooj/hydrojudge", "bin": "bin/hydrojudge.js", - "version": "2.15.0", + "version": "2.15.1", "main": "package.json", "author": "undefined ", "repository": "https://github.com/hydro-dev/Hydro.git", diff --git a/packages/hydrojudge/src/judge/default.ts b/packages/hydrojudge/src/judge/default.ts index 72ba2154d..4fd9d4367 100644 --- a/packages/hydrojudge/src/judge/default.ts +++ b/packages/hydrojudge/src/judge/default.ts @@ -82,22 +82,6 @@ function judgeCase(c: Case, sid: string) { } else if (status === STATUS.STATUS_RUNTIME_ERROR && code) { if (code < 32) message = signals[code]; else message = { message: 'Your program returned {0}.', params: [code] }; - const langConfig = ctx.getLang(ctx.lang); - if (langConfig.runtimeErrorAnalysis && !this.runtimeErrorAnalysis) { - this.runtimeErrorAnalysis = true; - run(langConfig.runtimeErrorAnalysis, { - copyIn: { - input: { src: stdin }, - [langConfig.code_file || 'foo']: { content: ctx.code }, - compile: { content: langConfig.compile }, - execute: { content: langConfig.execute }, - }, - time: 5000, - memory: 256, - }) - .then((r) => ctx.next({ compiler_text: r.stdout.toString().substring(0, 1024) })) - .catch((e) => console.error(e)); - } } await Promise.all( Object.values(res.fileIds).map((id) => del(id)), @@ -107,6 +91,25 @@ function judgeCase(c: Case, sid: string) { await runner(ctx, ctxSubtask); return; } + if ([STATUS.STATUS_WRONG_ANSWER, STATUS.STATUS_RUNTIME_ERROR].includes(status)) { + const langConfig = ctx.getLang(ctx.lang); + if (langConfig.analysis && !ctx.analysis) { + ctx.analysis = true; + run(langConfig.analysis, { + copyIn: { + input: { src: stdin }, + [langConfig.code_file || 'foo']: { content: ctx.code }, + compile: { content: langConfig.compile }, + execute: { content: langConfig.execute }, + }, + time: 5000, + memory: 256, + }).then((r) => { + ctx.next({ compiler_text: r.stdout.toString().substring(0, 1024) }); + if (process.env.DEV) console.log(r); + }); + } + } ctxSubtask.score = Score[ctxSubtask.subtask.type](ctxSubtask.score, score); ctxSubtask.status = Math.max(ctxSubtask.status, status); if (ctxSubtask.status > STATUS.STATUS_ACCEPTED) ctx.failed[sid] = true; diff --git a/packages/hydrojudge/src/judge/interface.ts b/packages/hydrojudge/src/judge/interface.ts index 7e59af7bc..88fe0518f 100644 --- a/packages/hydrojudge/src/judge/interface.ts +++ b/packages/hydrojudge/src/judge/interface.ts @@ -46,6 +46,7 @@ export interface RuntimeContext { queue?: PQueue; errored?: boolean; rerun?: number; + analysis?: boolean; failed?: Record; execute?: Execute; diff --git a/packages/hydrojudge/src/judge/run.ts b/packages/hydrojudge/src/judge/run.ts index 0afcd9959..b1b181720 100644 --- a/packages/hydrojudge/src/judge/run.ts +++ b/packages/hydrojudge/src/judge/run.ts @@ -79,9 +79,12 @@ export const judge = async (ctx: Context) => { status = STATUS.STATUS_RUNTIME_ERROR; if (code < 32) message.push(`ExitCode: ${code} (${signals[code]})`); else message.push(`ExitCode: ${code}`); + } + if ([STATUS.STATUS_WRONG_ANSWER, STATUS.STATUS_RUNTIME_ERROR].includes(status)) { const langConfig = ctx.getLang(ctx.lang); - if (langConfig.runtimeErrorAnalysis) { - run(langConfig.runtimeErrorAnalysis, { + if (langConfig.analysis) { + ctx.analysis = true; + run(langConfig.analysis, { copyIn: { input: { src: stdin }, [langConfig.code_file || 'foo']: { content: ctx.code }, @@ -90,9 +93,10 @@ export const judge = async (ctx: Context) => { }, time: 5000, memory: 256, - }) - .then((r) => ctx.next({ compiler_text: r.stdout.toString().substring(0, 1024) })) - .catch((e) => console.error(e)); + }).then((r) => { + ctx.next({ compiler_text: r.stdout.toString().substring(0, 1024) }); + if (process.env.DEV) console.log(r); + }); } } message.push(fs.readFileSync(stdout).toString()); diff --git a/packages/hydrojudge/src/sysinfo.ts b/packages/hydrojudge/src/sysinfo.ts index f9778f7f5..d5a6a6e45 100644 --- a/packages/hydrojudge/src/sysinfo.ts +++ b/packages/hydrojudge/src/sysinfo.ts @@ -62,9 +62,11 @@ int main(){ return parseInt(a[a.length - 2], 10); } +const stackPromise = stackSize(); + export async function get() { const info = await _get(); // @ts-ignore - info.stack = await stackSize(); + info.stack = await stackPromise; return info; }