项目理念 |码宝
描述: “帮助 Codeforces 用户方便地编写代码的 Visual Studio 代码扩展”
CodePal 是一个 Visual Studio 代码扩展,可帮助Codeforces用户方便地编写代码。此扩展特别适用于希望在现场 Codeforces 比赛中节省时间并轻松解决问题的人。此扩展程序快速响应用户。它可以通过指定标签和评级来快速过滤问题列表,为竞赛和问题创建文件夹,其中包含每个问题的示例测试,并自动编译和运行测试。为了更加方便,我们创建了按钮来直接在默认浏览器上打开问题陈述和提交页面。
所用技术的简要概述:
节点JS
- Node.js 是一个开源的、跨平台的、后端的 JavaScript 运行时环境,它在 V8 引擎上运行并在 Web 浏览器之外执行 JavaScript 代码。 Node.js 让我们可以使用 JavaScript 编写命令行工具和服务器端脚本——在将页面发送到用户的 Web 浏览器之前,在服务器端运行脚本以生成动态网页内容。在我们的例子中是 VSCode 编辑器。
- 只有使用 NodeJS,我们才能对 Codeforces 执行 API 调用以获取我们扩展的所有功能。我们还使用 NodeJS 从互联网上抓取数据。
代码力量 API
- Codeforces API 非常有用,我们的大部分功能对 Codeforces 执行 API 调用以获取有用信息。
- 但它并不能提供一切。我们的扩展程序使用 Codeforces 网站的少量网络抓取来获取 API 未提供的数据,例如问题的测试用例。
- Codeforces API 的文档很小但很清晰。
打字稿
- TypeScript 是 JavaScript 的类型化超集,可编译为纯 JavaScript。它提供类、模块和接口来帮助您构建健壮的组件。
- TypeScript 代码通过 TypeScript 编译器或 Babel 转换为 JavaScript 代码。这个 JavaScript 是干净、简单的代码,可以在 JavaScript 运行的任何地方运行:在浏览器、Node.JS 或应用程序中。在我们的例子中,最终的 JavaScript 文件将在 Node.JS 上运行。
- 由于存在编译,因此与 JavaScript 相比,Typescript 使调试代码变得更加容易。
VS 代码 API
- 这就是 VS Code 流行的主要原因。 VS Code API 有很多有用的特性,它们不仅让我们对环境有很多控制权,而且让我们很容易理解和编码。
- 有组织的树视图、上下文菜单、键绑定、输入框等是此扩展中使用的一些 API 功能。
- VS Code API Typescript 文档的重要性和实用性怎么强调都不为过。它简洁、干净,而且信息量非常大。它被大量提到这个项目。
演示:在设置中输入句柄并查看问题、竞赛和个人资料,以及每个问题的提交状态。
创建包含所有示例测试的问题/竞赛文件夹,自动编译和运行,获得综合判定,并查看问题陈述和提交网页。
过滤问题:
压力测试你的代码:
扩展的特点及其实现细节
查看完整的问题集列表及其相关标签和评级:问题列表及其详细信息可通过 Codeforces API 获得。维护一个问题类,该类通过从该 API 端点获取所有问题的详细信息进行初始化。获取的问题列表显示在窗口左侧活动栏中的树形视图中。
通过指定 Ratings、Tags和 Submission Status快速过滤 ProblemSet :树视图中呈现的问题列表在内部根据问题标签、问题评级范围和提交状态进行过滤,并在屏幕上重新呈现。过滤器的输入是通过 VS Code API 获取的。
查看当前正在运行、即将举行的比赛和所有过去的比赛,还可以查看即将举行的比赛的确切开始日期、时间和持续时间:可通过 Codeforces API 获得比赛列表及其详细信息。我们维护了一个竞赛类,该类通过从该 API 端点获取所有竞赛的详细信息进行初始化。比赛列表也显示在窗口左侧活动栏的树形视图中。
在 Codeforces 竞赛列表中单击 Contests 和从 Codeforces 问题列表中的 Problems 快速创建文件夹:当用户希望为 Codeforces 上的问题创建文件夹时,将创建一个带有问题名称的文件夹并测试用例特定问题是从问题的网页中抓取的,并包含在同一文件夹中。
当用户希望创建竞赛文件夹时,会创建一个以竞赛名称命名的文件夹,并为竞赛中的每个问题迭代创建一个文件夹。
一个问题的文件夹由它的所有示例测试用例和一个加载了模板的程序文件组成,该模板的路径可以在设置中指定:问题文件夹中还包括一个名为“Problem_name.{extension}”的文件,它加载如果您在扩展程序的设置中指定模板路径,您喜欢的任何起始模板。
为任何问题添加额外的测试: 2 名为“input_{test_number}.txt”和“output_{test_number}.txt”的额外文件被创建,用户可以分别输入他想要的输入和预期的输出。
针对测试用例编译和运行任何程序文件并获得综合结果: *child_process* 库用于在主机系统上运行编译和运行命令。我们确保终止正在运行的程序进程,以防它超过 6 秒的执行时间。我们通过在 JavaScript 中使用 promise 竞赛来衡量时间。我们设置了 6 秒的超时时间并运行程序,无论哪个 promise 接受或拒绝首先结束等待,然后终止正在运行的程序。这对于向用户指示“超出时间限制”非常重要。
代码在问题文件夹中已经存在的每个示例测试用例上运行,并且为每个测试创建一个文件,其中包含代码产生的输出,该文件与预期的输出文件进行比较以给出判断。创建一个名为“result.txt”的文件,其中包含每个测试的所有详细信息,包括输入、预期输出、获得的输出和标准错误,以及测试的最终判断。如果出现编译错误或运行时错误,则会将错误记录到名为“error.txt”的文件中。
在默认浏览器上打开问题陈述或提交页面,在 VS Code 中单击一下:在与问题文件相同的目录中保存一个名为“.problem.json”的文件。这个 json 文件包含问题索引和它所参加的比赛的 ID,以及足以构建问题 URL 的详细信息。因此,当用户单击“打开问题陈述”按钮时,我们会借助 json 文件构建 URL,并在您的默认浏览器中打开它。同样,也可以打开问题提交页面。
可以选择编译器,可以通过codepal设置设置编译标志:运行命令来编译和运行用户在他/她自己的系统上编写的程序。它们是根据从 CodePal 设置中选择的语言编译和运行的。我们还允许用户可能想要添加的其他编译标志。我们将这些标志添加到编译命令中。示例:“-std=c++14”
执行压力测试为您的代码找到一个反测试用例:我们为用户再创建 2 个文件
- 生成器文件:该文件应该由用户填写,以生成问题指定的输入格式的随机测试用例。
- 程序文件:用户可能会编写正确的解决方案或暴力解决方案,他可能希望将其与自己的解决方案进行比较。
现在,我们运行生成器文件并创建测试用例,并根据用户需要多次针对生成的测试用例迭代运行用户代码和他输入的程序文件。他们可以在设置中指定他希望这继续的次数。这将在用户代码给出的输出和程序文件不同时立即停止。
通过在 codepal 设置中输入您的 Codeforces 句柄,获得查看 Codeforces 个人资料的详细信息和提交的问题状态的个性化体验:给定用户的句柄,codeforces API 可以返回有关用户的基本信息。我们在用户配置文件部分介绍了这一点。 codeforces API 还返回给定用户所做的所有提交的集合。我们根据问题 ID 对提交进行排序,然后在用户的提交和问题(已经按照问题 ID 排序)中运行一个指针,并确定问题的提交状态(通过、失败、未尝试)。
支持的语言:
- C++(编译器:g++)
- C(编译器:gcc)
- Java (编译器:javac)
- Python
注意:您可以通过 codepal 设置添加其他编译标志(例如:-std=c++14),还可以根据您在系统上运行的Python命令在Python 、python2 或 python3 之间进行选择。
支持的操作系统:
- 视窗
- Linux
- 苹果电脑
键盘快捷键:
- Ctrl + Alt + A(*Cmd + Alt + A* for Mac):添加手动测试用例
- Ctrl + Alt + R(*Cmd + Alt + R* for Mac):在解决方案文件上运行测试用例
- Ctrl + Alt + O(*Cmd + Alt + O* for Mac):打开 Codeforces 上的问题陈述
- Ctrl + Alt + S(*Cmd + Alt + S* for Mac):在 Codeforces 上打开问题提交页面
- Ctrl + Alt + Z(*Cmd + Alt + Z* for Mac):开始压力测试
- Ctrl + Shift + Z(*Cmd + Shift + Z* for Mac):强制停止压力测试
结论:构建 VS Code 扩展是了解像 VS Code 这样流行的代码编辑器如何工作的好方法。此外,此扩展有助于竞争性编程社区。
- 这个想法已作为一个开源项目实施。我们目前有超过 1200 次下载和超过 550 次活动安装。
- 您可以在此处安装我们的扩展程序。
- 要了解有关 CodePal 及其代码库的更多信息,您可以在此处访问其公共存储库。
- 可以在此处找到详细的使用指南。
团队成员
- 扬曼什·阿加瓦尔
- 尼兰詹·亚迪亚拉
- 阿迪亚奇拉尼亚
- 普拉文·雷迪