@jinxedbuffer/cfkit
Version:
cfkit is a CLI tool for competitive programming leveraging Codeforces API.
100 lines (83 loc) • 3.09 kB
JavaScript
import fs from "fs";
import ora from "ora";
import {CURRENT_WORKING_DIR, getContestProblemsIndices, getTestCases} from "../helpers/scraper-utils.js";
import {SEPARATOR} from "../helpers/judge-utils.js";
let CODE_TEMPLATE;
export const generate = async function (cmd) {
try {
CODE_TEMPLATE = fs.readFileSync(`${CURRENT_WORKING_DIR}/${cmd.template}`, 'utf8');
} catch (e) {
CODE_TEMPLATE = "";
}
if (cmd.contest) {
try {
await generateContestFiles(cmd.contest);
} catch (e) {
console.error(e);
}
return;
}
if (cmd.problem) {
try {
await generateProblemFiles(cmd.problem);
} catch (e) {
console.error(e);
}
return;
}
const inputFile = `${CURRENT_WORKING_DIR}/in.txt`;
const outputFile = `${CURRENT_WORKING_DIR}/out.txt`;
const codeFile = `${CURRENT_WORKING_DIR}/main.cpp`;
const spinner = ora('Generating files').start();
try {
fs.writeFileSync(inputFile, '');
fs.writeFileSync(outputFile, '');
fs.writeFileSync(codeFile, '');
spinner.succeed(' Successfully generated files');
} catch (e) {
spinner.fail(' Failed to generate files');
console.log(e);
}
}
const generateContestFiles = async function (contestId) {
const spinner = ora(`Generating files for contest # ${contestId}`).start();
try {
const problemIndices = await getContestProblemsIndices(contestId);
spinner.stop();
for (const index of problemIndices) {
await generateProblemFiles(`${contestId}${index}`);
}
} catch (e) {
spinner.fail(` Failed to generate files for contest # ${contestId}`);
console.error(e);
}
}
const generateProblemFiles = async function (problemId) {
let match, contestId, problemIndex;
match = problemId.match(/^(\d+)([A-Z]\d*)$/);
if (!match) {
throw new Error(`Invalid problem ID`);
}
contestId = match[1];
problemIndex = match[2];
const problemFolder = `${CURRENT_WORKING_DIR}/${problemId}`;
const inputFile = `${problemFolder}/in.txt`;
const outputFile = `${problemFolder}/out.txt`;
const codeFile = `${problemFolder}/main.cpp`;
const spinner = ora(`Generating files for problem # ${problemId}`).start();
try {
const testcases = await getTestCases(contestId, problemIndex);
const inputBuffer = testcases.map((testcase) => testcase.input).join(SEPARATOR);
const outputBuffer = testcases.map((testcase) => testcase.output).join(SEPARATOR);
if (!fs.existsSync(problemFolder)) {
fs.mkdirSync(problemFolder);
}
fs.writeFileSync(inputFile, inputBuffer);
fs.writeFileSync(outputFile, outputBuffer);
fs.writeFileSync(codeFile, CODE_TEMPLATE);
spinner.succeed(` Successfully generated files for problem # ${problemId}`);
} catch (e) {
spinner.fail(` Failed to generate files for problem # ${problemId}`);
console.error(e);
}
}