(config: string | ProblemConfigFile = {}, files: string[])
| 5 | import type { ProblemConfig } from '../interface'; |
| 6 | |
| 7 | export async function parseConfig(config: string | ProblemConfigFile = {}, files: string[]) { |
| 8 | const cfg: ProblemConfigFile = typeof config === 'string' |
| 9 | ? await readYamlCases(load(config) as Record<string, any>) |
| 10 | : await readYamlCases(config); |
| 11 | const result: ProblemConfig = { |
| 12 | count: Object.keys(cfg.answers || {}).length || Math.sum((cfg.subtasks || []).map((s) => s.cases.length)), |
| 13 | memoryMin: Number.MAX_SAFE_INTEGER, |
| 14 | memoryMax: 0, |
| 15 | timeMin: Number.MAX_SAFE_INTEGER, |
| 16 | timeMax: 0, |
| 17 | type: cfg.type || 'default', |
| 18 | hackable: cfg.validator && cfg.checker && !['default', 'strict'].includes(cfg.checker_type), |
| 19 | }; |
| 20 | if (cfg.subType) result.subType = cfg.subType; |
| 21 | if (cfg.target) result.target = cfg.target; |
| 22 | result.count ||= Math.sum(readSubtasksFromFiles(files, cfg).map((i) => i.cases.length)); |
| 23 | if (cfg.subtasks?.length) { |
| 24 | for (const subtask of normalizeSubtasks(cfg.subtasks as any || [], (i) => i, cfg.time, cfg.memory)) { |
| 25 | result.memoryMax = Math.max(result.memoryMax, ...subtask.cases.map((i) => parseMemoryMB(i.memory))); |
| 26 | result.memoryMin = Math.min(result.memoryMin, ...subtask.cases.map((i) => parseMemoryMB(i.memory))); |
| 27 | result.timeMax = Math.max(result.timeMax, ...subtask.cases.map((i) => parseTimeMS(i.time))); |
| 28 | result.timeMin = Math.min(result.timeMin, ...subtask.cases.map((i) => parseTimeMS(i.time))); |
| 29 | } |
| 30 | } else { |
| 31 | if (cfg.time) result.timeMax = result.timeMin = cfg.time as unknown as number; |
| 32 | if (cfg.memory) result.memoryMax = result.memoryMin = cfg.memory as unknown as number; |
| 33 | } |
| 34 | if (result.memoryMax < result.memoryMin) result.memoryMax = result.memoryMin = 256; |
| 35 | if (result.timeMax < result.timeMin) result.timeMax = result.timeMin = 1000; |
| 36 | if (cfg.langs) result.langs = cfg.langs; |
| 37 | if (cfg.redirect) result.redirect = cfg.redirect.split('/', 2) as any; |
| 38 | if (cfg.filename && result.type === 'default') result.subType = cfg.filename; |
| 39 | return result; |
| 40 | } |
no test coverage detected