oimp
v1.4.8
Published
A CLI tool for generating OI problem and packages
Maintainers
Readme
OI Tools (oimp)
一个强大的OI(信息学奥林匹克)题目生成和管理工具,支持题目创建、测试数据生成、打包导出以及实时预览功能。
最新版本: v1.4.7 | 发布日期: 2026-02-10
📖 查看完整更新日志
✨ 功能特性
- 🚀 题目初始化: 快速创建标准化的OI题目结构
- 💻 Web IDE集成开发环境: 完整的浏览器内开发环境
- 📁 文件管理、🧑💻 代码编辑、🔍 查找替换、🖥️ 集成终端
- 📝 实时预览(GitHub 风格、数学公式、图片)、📊 状态面板
- 🎯 工作流按钮、🖼️ 图片粘贴/上传、⚡ 离线可用
- 🔧 题目编辑: 交互式编辑题目信息、支持目录重命名和模板补全
- 🛠️ 修复功能: 自动补全标准目录和文件
- 📥 导入功能: 从hydrooj格式的zip文件导入题目
- 🧪 智能状态管理: 基于文件修改时间的精细化状态管理
- std.cpp/validator.cpp 修改触发 testsample 重新测试
- generator.cpp 修改不触发 testsample(智能检查)
- 核心文件修改触发 data/check/package 重新做
- 🧪 多解法支持: 支持 std.cpp、std-force.cpp、std-fast.cpp、std-error.cpp
- 📦 题目打包: 支持非交互式打包(--default 参数)
- ✅ 完整性检查: 自动编译 checker.cpp 确保判题准确
- 📸 快照管理: 管理题目版本快照
- 🛡️ 判题安全: checker.cpp 自动编译,变更必定生效
- 🛡️ 编译安全: std.cpp 编译失败时立即退出并更新状态
- 🧑💻 编码兼容: 强制使用 UTF-8 编码
- 🔨 一键编译: 实时显示编译过程和错误信息
- 🧪 自动测试: diff 功能自动测试样例
- 📝 样例导入/导出: 预览区支持与 sample 文件双向同步
📦 安装
# 克隆项目
git clone https://github.com/chjshen/oimp.git
cd oimp
# 安装依赖
yarn install
# 全局可用
yarn link
# 全局安装(可选)
yarn global add oimp🚦 推荐使用流程
初始化题目
oimp init <题目ID> # 或使用参数 oimp init <题目ID> --name <题目名称> --tag <标签1,标签2> --memory 256m --time 1000ms --checker wcmp.cpp启动 Web IDE
oimp watch <题目ID>在 Web IDE 中完成开发
- 编辑题面、标准程序、数据生成器、验证器等
- 使用底部工作流按钮快速执行命令
- 实时查看题目开发状态
命令行操作(可选)
oimp testsample <题目ID>- 测试样例oimp check <题目ID>- 检查完整性oimp gendata <题目ID>- 生成测试数据oimp package <题目ID>- 打包题目oimp import <zip-file-path>- 从zip文件导入题目oimp fix <题目ID>- 自动补全文件
🚀 快速开始
1. 创建新题目
# 创建题目
oimp init fibonacci
# 强制覆盖
oimp init fibonacci --force
# 使用参数初始化
oimp init fibonacci --name "斐波那契数列" --tag "数学,动态规划" --memory 256m --time 1000ms --checker wcmp.cpp
# 非交互式(使用默认值)
oimp init fibonacci --default2. 修复题目文件
oimp fix fibonacci3. 启动 Web IDE
oimp watch fibonacci
# 指定端口
oimp watch fibonacci -p 80804. 生成测试数据
# 生成默认数量
oimp gendata fibonacci
# 生成指定数量
oimp gendata fibonacci -c 10智能检查:仅 generator.cpp 修改时跳过样例检测直接生成数据。
5. 检查题目完整性
oimp check fibonacci检查项目:目录结构、必要文件、配置格式、测试数据、程序编译。
6. 查看题目状态
oimp status fibonacci显示各步骤状态(done、need-redo、pending),智能跟踪文件变更。
7. 查看测试样例
oimp testsample fibonacci功能特性:
- 自动编译所有 std-*.cpp 文件
- 自动验证样例输入是否符合 validator 要求
- std.cpp 编译失败时立即退出并更新状态
- 使用 checker.cpp 进行精确答案比对
8. 打包题目
# 交互式打包
oimp package fibonacci
# 非交互式打包
oimp package fibonacci --default生成 fibonacci.zip 文件,--default 参数自动使用默认选项。
9. 导入题目
# 从hydrooj格式的zip文件导入题目
oimp import /path/to/fibonacci_hydrooj.zip
# 强制覆盖已存在的目录
oimp import /path/to/fibonacci_hydrooj.zip --force
# 指定目标目录名称
oimp import /path/to/fibonacci_hydrooj.zip --name my_fibonacci_problem从hydrooj格式的zip文件导入题目到本地,自动还原目录结构和文件路径。
🛠️ 可用命令和参数说明
所有可用命令
| 命令 | 描述 |
|------|------|
| oimp init <题目ID> | 初始化新题目 |
| oimp edit <题目ID> | 编辑题目信息 |
| oimp watch <题目ID> | 启动Web IDE |
| oimp check <题目ID> | 检查题目完整性 |
| oimp gendata <题目ID> | 生成测试数据 |
| oimp testsample <题目ID> | 测试样例 |
| oimp package <题目ID> | 打包题目 |
| oimp import <zip-file-path> | 从zip文件导入题目 |
| oimp status <题目ID> | 显示题目状态 |
| oimp fix <题目ID> | 修复题目文件 |
| oimp snapshot <题目ID> | 管理题目快照 |
通用参数说明
| 参数 | 描述 | 示例 |
|------|------|------|
| -c <value> | 指定生成测试数据的数量(用于gendata命令) | oimp gendata prob -c 20 |
| --force 或 -f | 强制覆盖现有目录或文件 | oimp init prob --force |
| --default 或 -d | 使用默认选项进行非交互式操作 | oimp package prob --default |
| --name <value> | 指定题目名称 | oimp init prob --name "My Problem" |
| --tag <value> | 指定标签(多个标签用逗号分隔) | oimp init prob --tag "动态规划,图论" |
| --memory <value> | 指定内存限制 | oimp init prob --memory 512m |
| --time <value> | 指定时间限制 | oimp init prob --time 2000ms |
| --checker <value> | 指定检查器类型 | oimp init prob --checker wcmp.cpp |
| --port <value> 或 -p | 指定端口号(用于watch命令) | oimp watch prob -p 3000 |
| --name <value> | 指定导入时的目标目录名称(用于import命令) | oimp import prob.zip --name new_prob |
📁 项目结构
oi-tools/
├── bin/oimp.js # 主入口
├── lib/
│ ├── commands/ # 命令模块
│ │ ├── init.js # 初始化
│ │ ├── edit.js # 编辑
│ │ ├── watch.js # Web IDE
│ │ ├── genrate.js # 生成数据
│ │ ├── check.js # 检查
│ │ ├── testsample.js # 测试样例
│ │ ├── package.js # 打包
│ │ ├── import.js # 导入
│ │ ├── status.js # 状态
│ │ ├── fix.js # 修复
│ │ └── snapshot.js # 快照
│ ├── templates/ # 模板文件
│ │ ├── problem_zh.md
│ │ ├── std.cpp
│ │ ├── validator.cpp
│ │ ├── generator.cpp
│ │ ├── checker.cpp
│ │ └── static/ # Web IDE 资源
│ └── utils.js
├── package.json
└── README.md📂 题目目录结构
题目名称/
├── problem_zh.md # 题目描述
├── problem.yaml # 题目配置
├── std.cpp # 标准解答
├── validator.cpp # 数据验证器
├── generator.cpp # 数据生成器
├── checker.cpp # 自定义评测器
├── solution/stdsol.md # 标准题解
├── additional_file/ # 附加文件(图片、文档等)
├── sample/ # 样例输入输出
└── testdata/ # 测试数据🎨 Web IDE 功能
核心组件
- 文件树:浏览、切换、编辑文件
- 代码编辑器:Monaco Editor,语法高亮、智能提示
- 集成终端:xterm.js,执行命令、显示输出
- 实时预览:GitHub 风格 Markdown、数学公式、图片
C++ 编辑器功能
- 保存(Ctrl+S)
- 编译:实时显示编译过程和错误
- 运行:编译并运行当前程序
- diff 测试:自动测试样例并与标准答案比对
- 测试验证器:专门测试 validator.cpp
样例管理
- 预览区自动检测样例代码块
- 读入:从 sample 文件导入内容
- 写入:将内容写入 sample 文件
- 取消:跳过当前代码块
工作流按钮
- 题目状态、编辑元数据、修复、快照
- 编辑题面、编辑标程、编辑数据生成器、编辑验证器
- 测试样例、检查、生成数据、打包
🔧 配置说明
题目配置 (problem.yaml)
title: "斐波那契数列"
tag: ["入门", "动态规划"]评测配置 (testdata/config.yaml)
time: "1000ms"
memory: "256m"🌐 跨平台支持
工具全面支持 Windows、Linux、macOS,自动适配:
- 文件比较命令:fc (Windows) / diff (Unix)
- 文件清理命令:del (Windows) / rm (Unix)
- 文件检查:if exist (Windows) / if [ -f ] (Unix)
📝 许可证
MIT License
🤝 贡献
欢迎提交 Issue 和 Pull Request!
