OJ 测试数据生成器
<!-- SLOW_UPDATE_START -->
核心规则(不可变)
- cyaron 唯一工具 — 必须用 cyaron v0.7.0+(当前最新版),严禁用 random 替代 cyaron 生成数据(仅允许
random.seed()固定种子) - 10 组数据 — 固定 1.in/1.out ~ 10.in/10.out
- 新版 API —
input_writeln、weight_limit、Graph.flower()、Graph.tree()、Graph.complete() - 标程必须 AC — 正确性优先于性能
- 确认后即执行 — 一次性展示方案,用户确认后全自动生成,不再逐步骤打断
- 默认不打包 — 默认只输出文件夹(1.in~10.in / 1.out~10.out);仅当用户明确要求打包时才打 ZIP,且打包前确认方式:平铺 20 个文件,或按题目文件夹
已验证有效的模式
- 测试点分布:1(最小) → 2-3(边界) → 4-6(中等随机) → 7-8(大规模) → 9-10(极端)
- 路径处理:绝对路径 + 复制脚本到输出目录 +
CYARON_OUTPUT_DIR环境变量 - 内容分离:SKILL.md 仅速查,完整 API 见
references/ - 交付方式:默认文件夹,用户要求打包时确认 ZIP 布局(flat / folder)
已知反模式
- ❌ 旧版 API(
write_writeln、Graph.star()、weight=) - ❌ 相对路径依赖
- ❌ 多次打断用户确认
<!-- SLOW_UPDATE_END -->
工作流程(三阶段)
阶段 1:自动分析
从题目描述中自动提取,无需用户干预:
| 提取项 | 说明 |
|---|---|
| 题目类型 | 排序/图论/DP/数学/字符串/数据结构/搜索/几何 |
| 输入格式 | 变量名、顺序、单行/多行、T 组用例 |
| 输出格式 | 单个值/多行、无解约定(-1/Impossible) |
| 数据范围 | 若未指定则按题型推断合理默认值 |
| 边界约束 | 特殊条件(质数、互质、连通性等) |
> 题型模式参考:references/common_patterns.md(12+ 题型)
> cyaron API 参考:references/cyaron_guide.md
阶段 2:一次性确认 🛑
自动分析完成后,向用户展示一份完整方案,包含:
📋 题目理解
- 类型:xxx
- 输入:xxx
- 输出:xxx
- 范围:xxx
📊 10组测试点分布
#1 最小规模 n=1 (基础验证)
#2 边界 xxx (xxx)
#3 边界 xxx (xxx)
#4-6 中等随机 n=xxx~xxx (典型情况)
#7-8 大规模 n≈上限 (性能压力)
#9-10 极端边界 最大+特殊构造 (压力+corner)
⚙️ 标程方案
- 语言:Python/C++
- 算法:xxx,复杂度 O(xxx)
📦 输出配置
- 题目名:xxx
- 输出目录:./output
- 交付格式:文件夹(默认,不打包)
- 打包 ZIP:仅当用户要求时 → 问清布局:平铺20个文件 / 按题目文件夹
用户确认或调整后,进入阶段 3。这是唯一一次确认,之后全自动执行。
阶段 3:一键生成
用户确认后,自动完成以下全部操作:
- 生成标程 — 写入
std.py或std.cpp - 生成 cyaron 脚本 — 写入
gen_data.py,覆盖 10 组测试点(文件命名必须为1.in~10.in) - 执行生成 — 调用
scripts/generate_data.py:
bash python3 scripts/generate_data.py --problem <name> [--seed 42] [--zip] [--zip-mode flat|folder]
---seed通过CYARON_SEED传给 gen_data.py,同一种子输出完全可复现
---count为高级选项,默认 10;自定义时需同步修改gen_data.py的DATA_COUNT - 自动校验(见下方校验清单)
- 交付 — 默认不打包,直接交付输出文件夹;仅当用户明确要求打包时执行
--zip,并按确认的布局传--zip-mode flat(平铺20个文件)或--zip-mode folder(按<name>/文件夹)
自动校验清单
脚本自动检查(generate_data.py,不通过则中止并报错):
- [x] 1.in ~ 10.in / 1.out ~ 10.out 全部存在且文件数与
--count一致 - [x] 所有文件非空
- [x] 所有文件为合法 UTF-8 编码
- [x] ZIP 完整性校验(testzip,仅
--zip打包时) - [x] 标程异常或超时时中止打包,不交付残缺数据
Agent 人工检查(无法机械判定的部分,交付前确认):
- [ ] .in 文件格式符合题目描述
- [ ] 最小数据(#1)和最大数据(#9-10)均有覆盖
- [ ] 输出格式正确(无解约定、换行、精度等)
> 建议改动脚本后运行 python3 scripts/smoke_test.py 做端到端回归。
测试点设计原则
分布策略
| 编号 | 规模 | 目的 |
|---|---|---|
| 1 | 最小合法值 | 基础验证 |
| 2-3 | 小规模 | 边界/特殊构造 |
| 4-6 | 中规模随机 | 典型情况 |
| 7-8 | 接近上限 | 性能压力 |
| 9-10 | 最大值+特殊构造 | 极端边界 |
按题型的边界覆盖
通用:最小值、最大值、全相同元素、已排序/逆序
数值:负数混合、溢出边界、模质数、GCD=1
图论/树:Graph.chain() 链、Graph.flower() 星、Graph.complete() 完全图、不连通图
字符串:空串、单字符、全相同、回文、最大长度
数组:递增/递减、山峰/山谷形、交替变化
DP:n=1、n=2、全相同、单调序列
异常处理
| 异常 | 处理 |
|---|---|
| cyaron 未安装 | 提示 pip install cyaron>=0.7.0(最新版),不可回退到 random |
| 数据范围缺失 | 按题型推断默认值,在确认方案中标注"推断" |
| C++ 编译失败 / 无 g++ | 脚本自动回退到同目录 std.py;无 Python 标程则中止并提示 |
| 标程超时(>30s) 或运行异常 | 脚本中止流程并列出异常测试点(不产出数据/ZIP),修复标程或缩数据后重新生成 |
| 磁盘不足 | 预估大小,超 500MB 时提示确认 |
文件结构
oj-data-generator/
├── SKILL.md # 本文件
├── scripts/
│ ├── generate_data.py # 主生成脚本(一键执行+打包)
│ ├── gen_data_template.py # cyaron 数据生成模板
│ ├── std_template.py # Python 标程模板
│ └── std_template.cpp # C++ 标程模板
├── references/
│ ├── cyaron_guide.md # cyaron 完整 API (v0.7.0)
│ └── common_patterns.md # 12+ 题型 cyaron 写法
├── test-prompts.json # 回归测试用例
└── optimization-report.md # 优化历史
注意事项
- cyaron 唯一工具:严禁 random 模块替代
- 新版 API 强制:
input_writeln/input_write、weight_limit、Graph.flower()/Graph.tree() - 标程 AC 优先:性能可略低于最优解
- UTF-8 + Unix 换行:所有文件统一编码
- seed 可复现:默认随机,可通过
--seed固定 - 避免中文路径
- 打包需用户确认:默认只交付文件夹;用户要求打包时,先在方案中确认布局(平铺 / 按文件夹),不要默认打 ZIP
示例
排序题
用户:给排序题造数据。输入 n m,第二行 n 个整数,输出前 m 大的数降序。n≤10^5。
流程:
1. 自动分析 → 展示方案(类型:排序,测试点: n=1/m=n/m=1/升序/逆序/全相等/10^5,标程: sort+切片 O(n log n))
2. 用户确认 → 一键生成 10 组数据 → 输出文件夹(用户要求打包再按确认布局出 zip)
最短路
用户:Dijkstra 模板题,n 点 m 边无向图,求 1 到 n 最短路,无解 -1。n≤10^5, m≤2×10^5。
流程:
1. 自动分析 → 展示方案(类型:图论-最短路,测试点: chain/flower/complete/tree/不连通,标程: Dijkstra 堆优化 O(m log n))
2. 用户确认 → 一键生成 → 输出文件夹(如需打包先确认布局)