mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-19 17:38:19 +08:00
judge: submit_answer: allow check by line
This commit is contained in:
1 parent
9bae058893
commit
0351282b59
3 files changed
+56
-18
No files matched your search
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@hydrooj/hydrojudge",
|
||||
"bin": "bin/hydrojudge.js",
|
||||
"version": "2.3.7",
|
||||
"version": "2.3.8",
|
||||
"main": "package.json",
|
||||
"author": "undefined <i@undefined.moe>",
|
||||
"repository": "https://github.com/hydro-dev/Hydro.git",
|
||||
|
||||
@@ -59,6 +59,22 @@ const checkers: Record<string, Checker> = {
|
||||
};
|
||||
},
|
||||
|
||||
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]:标准输出
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
}
|
||||
Reference in new issue
Block a user