judge: submit_answer: allow check by line

This commit is contained in:
undefined committed 2021-02-19 16:44:29 +08:00
1 parent 9bae058893
commit 0351282b59
3 files changed
+56 -18

No files matched your search

+1 -1
View File
@@ -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",
+16
View File
@@ -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]:标准输出
+39 -17
View File
@@ -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,
});
}