core: better testdata match experience (#620)

Co-authored-by: undefined <i@undefined.moe>
This commit is contained in:
pandaandundefined authored and GitHub committed 2023-08-05 00:26:21 +08:00
1 parent f45a509c05
commit da9676119b
1 file changed
+23 -12
+23 -12
View File
@@ -235,21 +235,21 @@ interface MatchRule {
output: ((a: RegExpExecArray) => string)[]; output: ((a: RegExpExecArray) => string)[];
id: (a: RegExpExecArray) => number; id: (a: RegExpExecArray) => number;
subtask: (a: RegExpExecArray) => number; subtask: (a: RegExpExecArray) => number;
preferredScorerType: 'min' | 'max' | 'sum'; preferredScorerType: (a: RegExpExecArray) => 'min' | 'max' | 'sum';
} }
const SubtaskMatcher: MatchRule[] = [ const SubtaskMatcher: MatchRule[] = [
{ {
regex: /^([^\d]*(?:\d+[a-zA-Z]+)*)(\d+)\.(in|txt)$/, regex: /^(([A-Za-z0-9]*?)(?:(\d*)[-_])?(\d+))\.in$/,
output: [ output: [
(a) => `${a[1] + a[2]}.out`, (a) => `${a[1]}.out`,
(a) => `${a[1] + a[2]}.ans`, (a) => `${a[1]}.ans`,
(a) => `${a[1] + a[2]}.out`.replace(/input/g, 'output'), (a) => `${a[1]}.out`.replace(/input/g, 'output'),
(a) => (a[1].includes('input') ? `${a[1] + a[2]}.txt`.replace(/input/g, 'output') : null), (a) => (a[1].includes('input') ? `${a[1]}.txt`.replace(/input/g, 'output') : null),
], ],
id: (a) => +a[2], id: (a) => +a[4],
subtask: () => 1, subtask: (a) => +(a[3] || 1),
preferredScorerType: 'sum', preferredScorerType: (a) => (a[3] ? 'min' : 'sum'),
}, },
{ {
regex: /^([^\d]*)\.in(\d+)$/, regex: /^([^\d]*)\.in(\d+)$/,
@@ -259,7 +259,7 @@ const SubtaskMatcher: MatchRule[] = [
], ],
id: (a) => +a[2], id: (a) => +a[2],
subtask: () => 1, subtask: () => 1,
preferredScorerType: 'sum', preferredScorerType: () => 'sum',
}, },
{ {
regex: /^([^\d]*)([0-9]+)([-_])([0-9]+)\.in$/, regex: /^([^\d]*)([0-9]+)([-_])([0-9]+)\.in$/,
@@ -269,7 +269,17 @@ const SubtaskMatcher: MatchRule[] = [
], ],
id: (a) => +a[4], id: (a) => +a[4],
subtask: (a) => +a[2], subtask: (a) => +a[2],
preferredScorerType: 'min', preferredScorerType: () => 'min',
},
{
regex: /^(([0-9]+)[-_](?:.*))\.in$/,
output: [
(a) => `${a[1]}.out`,
(a) => `${a[1]}.ans`,
],
id: (a) => +a[2],
subtask: () => 1,
preferredScorerType: () => 'sum',
}, },
]; ];
@@ -309,6 +319,7 @@ export function readSubtasksFromFiles(files: string[], config) {
if (!data) continue; if (!data) continue;
const sid = rule.subtask(data); const sid = rule.subtask(data);
const c = { input: file, output: '', id: rule.id(data) }; const c = { input: file, output: '', id: rule.id(data) };
const type = rule.preferredScorerType(data);
for (const func of rule.output) { for (const func of rule.output) {
if (config.noOutputFile) c.output = '/dev/null'; if (config.noOutputFile) c.output = '/dev/null';
else c.output = func(data); else c.output = func(data);
@@ -317,7 +328,7 @@ export function readSubtasksFromFiles(files: string[], config) {
subtask[sid] = { subtask[sid] = {
time: config.time, time: config.time,
memory: config.memory, memory: config.memory,
type: rule.preferredScorerType, type,
cases: [c], cases: [c],
}; };
} else if (!subtask[sid].cases) subtask[sid].cases = [c]; } else if (!subtask[sid].cases) subtask[sid].cases = [c];