APM

>Agent Skill

@majiayu000/vloj

skilldevelopment

LibreOJ题目抓取与解题工作流。用户输入形如loj1/loj001或https://loj.ac/p/1 等题号或URL时触发;创建以题号命名的空文件夹,使用Chrome DevTools MCP读取题面并保存为md文件,最后用C++、C、C#、Python、Java、Kotlin、Pascal、Rust、Go、Haskell生成解答文件。

pythonrustgojavacpp
apm::install
$apm install @majiayu000/vloj
apm::skill.md
---
name: vloj
description: LibreOJ题目抓取与解题工作流。用户输入形如loj1/loj001或https://loj.ac/p/1 等题号或URL时触发;创建以题号命名的空文件夹,使用Chrome DevTools MCP读取题面并保存为md文件,最后用C++、C、C#、Python、Java、Kotlin、Pascal、Rust、Go、Haskell生成解答文件。
---

# vloj

## 目标

- 解析题号,创建以题号命名的空文件夹。
- 访问对应题目页面,抓取题面并写入Markdown。
- 编写C++、C、C#、Python、Java、Kotlin、Pascal、Rust、Go、Haskell解答文件。

## 触发与解析

- 支持输入示例:`loj1``loj001``https://loj.ac/p/1``http://loj.ac/p/123`
- 提取连续数字作为题号,去除前导零后作为规范题号。
- 题目URL格式固定为:`https://loj.ac/p/<id>`

## 工作流

1. **创建空文件夹**
   - 在当前工作区根目录创建以题号命名的文件夹:`<id>/`
   - 若文件夹不存在,直接创建。
   - 若文件夹已存在且非空,先请求用户确认是否清空;确认后删除内容并保持空文件夹。

2. **读取题面(Chrome DevTools MCP)**
   - 打开题目URL并等待页面加载完成。
   - 使用页面快照或脚本评估获取题面主体文本:
     - 优先抓取页面主内容区域(常见为 `main``article`、或含“题目描述/输入格式/输出格式/样例”文本的容器)。
     - 无法精准定位时,回退使用 `document.body.innerText`,再按标题/小节进行整理。
   - 需要确保包含题目标题、描述、输入输出、样例与提示(如存在)。

3. **写入Markdown**
   - 在题号文件夹中创建 `problem.md`
   - 内容结构:
     - 标题:`# <题号> <题目标题>`
     - URL:`原始URL`
     - 题面正文分节整理(保留原有小节标题)。

4. **编写C++解答**
   - 在题号文件夹中创建 `solution.cpp`
   - 使用 C++11 标准,包含必要头文件与 `main()`
   - 依据题意实现可通过的解法,并在顶部用简短注释说明思路与复杂度。

5. **编写C解答**
   - 在题号文件夹中创建 `solution.c`
   - 使用 C11 标准,包含必要头文件与 `main()`
   - 依据题意实现可通过的解法,并在顶部用简短注释说明思路与复杂度。

6. **编写Python解答**
   - 在题号文件夹中创建 `solution.py`
   - 使用 Python 3.10,包含必要的输入输出处理。
   - 依据题意实现可通过的解法,并在顶部用简短注释说明思路与复杂度。

7. **编写Java解答**
   - 在题号文件夹中创建 `solution.java`
   - 使用 Java 8 标准,类名为 `Main`,包含 `main()` 方法。
   - 依据题意实现可通过的解法,并在顶部用简短注释说明思路与复杂度。

8. **编写Kotlin解答**
   - 在题号文件夹中创建 `solution.kt`
   - 使用 Kotlin 1.8 标准。
   - 依据题意实现可通过的解法,并在顶部用简短注释说明思路与复杂度。

9. **编写Pascal解答**
   - 在题号文件夹中创建 `solution.pas`
   - 使用 Free Pascal 3.2 标准。
   - 依据题意实现可通过的解法,并在顶部用简短注释说明思路与复杂度。

10. **编写Rust解答**
    - 在题号文件夹中创建 `solution.rs`
    - 使用 Rust 2021 标准。
    - 依据题意实现可通过的解法,并在顶部用简短注释说明思路与复杂度。

11. **编写Go解答**
    - 在题号文件夹中创建 `solution.go`
    - 使用 Go 1.x 标准。
    - 依据题意实现可通过的解法,并在顶部用简短注释说明思路与复杂度。

12. **编写Haskell解答**
    - 在题号文件夹中创建 `solution.hs`
    - 使用 Haskell 2010 标准。
    - 依据题意实现可通过的解法,并在顶部用简短注释说明思路与复杂度。

13. **编写C#解答**
    - 在题号文件夹中创建 `solution.cs`
    - 使用 C# 9 (.NET 5) 标准。
    - 依据题意实现可通过的解法,并在顶部用简短注释说明思路与复杂度。

## 输出约束

- 仅创建 `problem.md``solution.c``solution.cpp``solution.cs``solution.py``solution.java``solution.kt``solution.pas``solution.rs``solution.go``solution.hs`,不生成额外文件。
- 保持文件夹为空创建流程的前置步骤,先建目录再抓取题面。