diff --git a/packages/hydrojudge/package.json b/packages/hydrojudge/package.json index 000528aaf..718493b5f 100644 --- a/packages/hydrojudge/package.json +++ b/packages/hydrojudge/package.json @@ -1,7 +1,7 @@ { "name": "@hydrooj/hydrojudge", "bin": "bin/hydrojudge.js", - "version": "2.3.7", + "version": "2.3.8", "main": "package.json", "author": "undefined ", "repository": "https://github.com/hydro-dev/Hydro.git", diff --git a/packages/hydrojudge/src/checkers.ts b/packages/hydrojudge/src/checkers.ts index 2e58e0d8b..14b20cc24 100644 --- a/packages/hydrojudge/src/checkers.ts +++ b/packages/hydrojudge/src/checkers.ts @@ -59,6 +59,22 @@ const checkers: Record = { }; }, + async strict(config) { + const { stdout } = await run('/usr/bin/diff usrout stdout', { + copyIn: { + usrout: { src: config.user_stdout }, + stdout: { src: config.output }, + ...config.copyIn, + }, + }); + const status = stdout ? STATUS.STATUS_WRONG_ANSWER : STATUS.STATUS_ACCEPTED; + return { + score: status === STATUS.STATUS_ACCEPTED ? config.score : 0, + status, + message: '', + }; + }, + /* * argv[1]:输入 * argv[2]:标准输出 diff --git a/packages/hydrojudge/src/judge/submit_answer.ts b/packages/hydrojudge/src/judge/submit_answer.ts index 3ba1e5f5c..d8a56e660 100644 --- a/packages/hydrojudge/src/judge/submit_answer.ts +++ b/packages/hydrojudge/src/judge/submit_answer.ts @@ -1,25 +1,47 @@ +import { readFile } from 'fs-extra'; import * as STATUS from '../status'; -import { check } from '../check'; export async function judge({ next, end, config, code, }) { next({ status: STATUS.STATUS_JUDGING, progress: 0 }); - const [status, score, message] = await check({ - stdout: config.answer, - user_stdout: code, - checker_type: 'default', - score: 100, - detail: config.detail, - }); - next({ - status, - progress: 100, - case: { - status, score, time_ms: 0, memory_kb: 0, message, - }, - }); - end({ - status, score, time_ms: 0, memory_kb: 0, + code = code.replace(/\r/g, ''); + const expected = (await readFile(config.subtasks[0].cases[0].output)).toString().replace(/\r/g, ''); + if (config.subtasks.length === 1) { + const status = code.trim() === expected.trim() ? STATUS.STATUS_ACCEPTED : STATUS.STATUS_WRONG_ANSWER; + const score = status === STATUS.STATUS_ACCEPTED ? config.subtasks[0].score : 0; + next({ + status, + progress: 100, + case: { + status, score, time_ms: 0, memory_kb: 0, message: '', + }, + }); + return end({ + status, score, time_ms: 0, memory_kb: 0, + }); + } + const outputs = code.split('\n'); + let score = 0; + let totalStatus = 0; + const lines = expected.split('\n'); + for (const i in config.subtasks) { + const subtask = config.subtasks[i]; + let status = STATUS.STATUS_WRONG_ANSWER; + if (lines[i].trim() === outputs[i].trim()) { + score += subtask.score; + status = STATUS.STATUS_ACCEPTED; + } + totalStatus = Math.max(status, totalStatus); + next({ + status: totalStatus, + process: (100 * config.subtasks.length) / (+i + 1), + case: { + status, score, time_ms: 0, memory_kb: 0, message: '', + }, + }, i + 1); + } + return end({ + status: totalStatus, score, time_ms: 0, memory_kb: 0, }); }