mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-17 17:36:08 +08:00
judge: 测试数据组数过多时拒绝评测
This commit is contained in:
1 parent
1231fb2ce7
commit
13e874d139
6 files changed
+21
-30
No files matched your search
@@ -6,8 +6,8 @@ db_password=$(cat /dev/urandom | head -n 10 | md5sum | head -c 20)
|
||||
# Basic
|
||||
echo "apt-get update"
|
||||
apt-get -qq update
|
||||
echo "apt-get install curl wget unzip gnupg -y"
|
||||
apt-get install -y curl wget unzip gnupg >/dev/null
|
||||
echo "apt-get install curl wget gnupg -y"
|
||||
apt-get install -y curl wget gnupg >/dev/null
|
||||
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
|
||||
echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-4.0.list
|
||||
echo "apt-get update"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@hydrooj/hydrojudge",
|
||||
"bin": "bin/hydrojudge.js",
|
||||
"version": "2.1.14",
|
||||
"version": "2.1.15",
|
||||
"main": "package.json",
|
||||
"author": "masnn",
|
||||
"repository": "https://github.com/hydro-dev/Hydro.git",
|
||||
|
||||
@@ -293,5 +293,7 @@ export default async function readCases(folder: string, cfg: Record<string, any>
|
||||
} else if (fs.existsSync(iniConfig)) {
|
||||
config = { ...convertIniConfig(fs.readFileSync(iniConfig).toString()), ...cfg };
|
||||
}
|
||||
return await readYamlCases(folder, config, args);
|
||||
const result = await readYamlCases(folder, config, args);
|
||||
if (result.count > 100) throw new FormatError('测试数据组数过多,拒绝评测');
|
||||
return result;
|
||||
}
|
||||
@@ -50,7 +50,7 @@ class JudgeTask {
|
||||
|
||||
nextWaiting = [];
|
||||
|
||||
constructor(session, request, ws: WebSocket) {
|
||||
constructor(session: VJ4, request, ws: WebSocket) {
|
||||
this.stat = {};
|
||||
this.stat.receive = new Date();
|
||||
this.session = session;
|
||||
@@ -230,7 +230,7 @@ export default class VJ4 {
|
||||
return 'unknown';
|
||||
}
|
||||
|
||||
async problemData(domainId: string, pid: string, savePath, retry = 3, next?) {
|
||||
async problemData(domainId: string, pid: string, savePath: string, retry = 3, next?) {
|
||||
log.info(`Getting problem data: ${this.config.host}/${domainId}/${pid}`);
|
||||
await this.ensureLogin();
|
||||
if (next) next({ judge_text: '正在同步测试数据,请稍后' });
|
||||
@@ -249,7 +249,7 @@ export default class VJ4 {
|
||||
fs.ensureDirSync(path.dirname(savePath));
|
||||
const zip = new AdmZip(tmpFilePath);
|
||||
const entries = zip.getEntries();
|
||||
if (entries.length > 1000) throw new FormatError('Too many files');
|
||||
if (entries.length > 256) throw new FormatError('Too many files');
|
||||
await new Promise((resolve, reject) => {
|
||||
zip.extractAllToAsync(savePath, true, (e) => {
|
||||
if (e) reject(e);
|
||||
@@ -279,7 +279,7 @@ export default class VJ4 {
|
||||
fs.ensureDirSync(path.dirname(savePath));
|
||||
const zip = new AdmZip(tmpFilePath);
|
||||
const entries = zip.getEntries();
|
||||
if (entries.length > 1000) throw new FormatError('Too many files');
|
||||
if (entries.length > 256) throw new FormatError('Too many files');
|
||||
await new Promise((resolve, reject) => {
|
||||
zip.extractAllToAsync(savePath, true, (e) => {
|
||||
if (e) reject(e);
|
||||
@@ -319,7 +319,7 @@ export default class VJ4 {
|
||||
log.info(`[${this.config.host}] 已连接`);
|
||||
}
|
||||
|
||||
async setCookie(cookie) {
|
||||
async setCookie(cookie: string) {
|
||||
this.config.cookie = cookie;
|
||||
this.axios = axios.create({
|
||||
baseURL: this.config.server_url,
|
||||
@@ -357,7 +357,7 @@ export default class VJ4 {
|
||||
}
|
||||
}
|
||||
|
||||
async processData(folder) { // eslint-disable-line class-methods-use-this
|
||||
async processData(folder: string) { // eslint-disable-line class-methods-use-this
|
||||
let files = await fs.readdir(folder);
|
||||
let ini = false;
|
||||
if (files.length <= 2) {
|
||||
@@ -403,7 +403,7 @@ export default class VJ4 {
|
||||
return filePath;
|
||||
}
|
||||
|
||||
async retry(queue) {
|
||||
async retry(queue: Queue<any>) {
|
||||
this.consume(queue).catch(() => {
|
||||
setTimeout(() => {
|
||||
this.retry(queue);
|
||||
|
||||
@@ -75,7 +75,7 @@ async function postInit() {
|
||||
fs.ensureDirSync(path.dirname(savePath));
|
||||
const zip = new AdmZip(tmpFilePath);
|
||||
const entries = zip.getEntries();
|
||||
if (entries.length > 1000) throw new FormatError('Too many files');
|
||||
if (entries.length > 256) throw new FormatError('Too many files');
|
||||
await new Promise((resolve, reject) => {
|
||||
zip.extractAllToAsync(savePath, true, (e) => {
|
||||
if (e) reject(e);
|
||||
|
||||
@@ -3,30 +3,19 @@ import yaml from 'js-yaml';
|
||||
function convert(ini: string) {
|
||||
const f = ini.split('\n');
|
||||
const count = parseInt(f[0], 10);
|
||||
const res = { cases: [] };
|
||||
const res = { subtasks: [] };
|
||||
for (let i = 1; i <= count; i++) {
|
||||
const [input, output, time, score, memory] = f[i].split('|');
|
||||
const cur = {
|
||||
input, output, score: parseInt(score, 10), time: `${time}s`, memory: '128m',
|
||||
cases: [{ input: `input/${input}`, output: `output/${output}` }],
|
||||
score: parseInt(score, 10),
|
||||
time: `${time}s`,
|
||||
memory: '128m',
|
||||
};
|
||||
if (!Number.isNaN(parseInt(memory, 10))) cur.memory = `${Math.floor(parseInt(memory, 10) / 1024)}m`;
|
||||
res.cases.push(cur);
|
||||
res.subtasks.push(cur);
|
||||
}
|
||||
if (res.cases.length > 0) {
|
||||
const { time, score, memory } = res.cases[0];
|
||||
for (let i = 1; i < res.cases.length; i++) {
|
||||
if (res.cases[i].time !== time
|
||||
|| res.cases[i].score !== score
|
||||
|| res.cases[i].memory !== memory) {
|
||||
return yaml.safeDump(res);
|
||||
}
|
||||
}
|
||||
}
|
||||
return yaml.safeDump({
|
||||
time: res.cases[0].time,
|
||||
score: res.cases[0].score,
|
||||
memory: res.cases[0].memory,
|
||||
});
|
||||
return yaml.safeDump(res);
|
||||
}
|
||||
|
||||
global.Hydro.lib['testdata.convert.ini'] = convert;
|
||||
|
||||
Reference in new issue
Block a user