From 5803a1d94daf9b2d0894b83fab76f905bf782326 Mon Sep 17 00:00:00 2001 From: undefined Date: Fri, 14 Jun 2024 14:42:07 +0800 Subject: [PATCH] utils: subtask matcher: support uppercase --- packages/utils/lib/common.ts | 52 ++++++++++++++---------------------- 1 file changed, 20 insertions(+), 32 deletions(-) diff --git a/packages/utils/lib/common.ts b/packages/utils/lib/common.ts index be43a3521..657dcbd68 100644 --- a/packages/utils/lib/common.ts +++ b/packages/utils/lib/common.ts @@ -236,7 +236,7 @@ export function sortFiles(files: Record[] | string[], key = '_id') interface MatchRule { regex: RegExp; - output: ((a: RegExpExecArray) => string)[]; + output: (a: RegExpExecArray) => string[]; id: (a: RegExpExecArray) => number; subtask: (a: RegExpExecArray) => number; preferredScorerType: (a: RegExpExecArray) => 'min' | 'max' | 'sum'; @@ -244,47 +244,35 @@ interface MatchRule { const SubtaskMatcher: MatchRule[] = [ { - regex: /^(([A-Za-z0-9._-]*?)(?:(\d*)[-_])?(\d+))\.(in|txt|in\.txt)$/, - output: [ - (a) => `${a[1]}.out`, - (a) => `${a[1]}.out.txt`, - (a) => `${a[1]}.ans`, - (a) => `${a[1]}.ans.txt`, - (a) => `${a[1]}.out`.replace(/input/g, 'output'), - (a) => (a[1].includes('input') ? `${a[1]}.txt`.replace(/input/g, 'output') : null), - ], + regex: /^(([A-Za-z0-9._-]*?)(?:(\d*)[-_])?(\d+))\.(in|IN|txt|TXT|in\.txt|IN\.TXT)$/, + output: (a) => ['out', 'ans'] + .flatMap((i) => [i, i.toUpperCase(), `${i}.txt`, `${i.toUpperCase()}.TXT`]) + .flatMap((i) => [`${a[1]}.${i}`, `${a[1]}.${i}`.replace(/input/g, 'output').replace(/INPUT/g, 'OUTPUT')]) + .concat(a[1].includes('input') ? `${a[1]}.txt`.replace(/input/g, 'output') : null), id: (a) => +a[4], subtask: (a) => +(a[3] || 1), preferredScorerType: (a) => (a[3] ? 'min' : 'sum'), }, { - regex: /^([^\d]*)\.in(\d+)$/, - output: [ - (a) => `${a[1]}.ou${a[2]}`, - (a) => `${a[1]}.ou${a[2]}`.replace(/input/g, 'output'), - (a) => `${a[1]}.out${a[2]}`, - (a) => `${a[1]}.out${a[2]}`.replace(/input/g, 'output'), - ], + regex: /^([^\d]*)\.(in|IN)(\d+)$/, + output: (a) => [ + `${a[1]}.${a[2] === 'in' ? 'ou' : 'OU'}${a[3]}`, + `${a[1]}.${a[2] === 'in' ? 'out' : 'OUT'}${a[3]}`, + ].flatMap((i) => [i, i.replace(/input/g, 'output').replace(/INPUT/g, 'OUTPUT')]), id: (a) => +a[2], subtask: () => 1, preferredScorerType: () => 'sum', }, { - regex: /^([^\d]*)([0-9]+)([-_])([0-9]+)\.in$/, - output: [ - (a) => `${a[1]}${a[2]}${a[3]}${a[4]}.out`, - (a) => `${a[1]}${a[2]}${a[3]}${a[4]}.ans`, - ], + regex: /^([^\d]*)([0-9]+)([-_])([0-9]+)\.(in|IN)$/, + output: (a) => ['out', 'ans', 'OUT', 'ANS'].flatMap((i) => `${a[1]}${a[2]}${a[3]}${a[4]}.${i}`), id: (a) => +a[4], subtask: (a) => +a[2], preferredScorerType: () => 'min', }, { - regex: /^(([0-9]+)[-_](?:.*))\.in$/, - output: [ - (a) => `${a[1]}.out`, - (a) => `${a[1]}.ans`, - ], + regex: /^(([0-9]+)[-_](?:.*))\.(in|IN)$/, + output: (a) => ['out', 'ans', 'OUT', 'ANS'].flatMap((i) => `${a[1]}.${i}`), id: (a) => +a[2], subtask: () => 1, preferredScorerType: () => 'sum', @@ -329,12 +317,12 @@ export function readSubtasksFromFiles(files: string[], config) { const sid = rule.subtask(data); const c = { input: file, output: '', id: rule.id(data) }; const type = rule.preferredScorerType(data); - for (const func of rule.output) { - if (config.noOutputFile) c.output = '/dev/null'; - else c.output = func(data); - if (c.output === file) continue; - if (c.output === '/dev/null' || files.includes(c.output)) { + const outputs = (config.noOutputFile ? ['/dev/null'] : rule.output(data)).filter((i) => i); + for (const output of outputs) { + if (output === file) continue; + if (output === '/dev/null' || files.includes(output)) { match = true; + c.output = output; if (!subtask[sid]) { subtask[sid] = { time: config.time,