# T0-CSP：星港舱门报码归一化（手动编程路线）

## 题目背景

星港是一座用于向太空输送物资的集散港。运行区并不是普通园区里的门禁系统，连接主压差环、减压环廊、货运气闸、外作业桥和检修井接口的，是一整套分层舱门网络。

任何一扇舱门的状态报码，都会直接影响人员隔离、货箱转运、局部舱段气压切换，以及夜班对接窗口的安全放行。

问题在于，巡检蜂群、拖运车队和人类值班员为了抢时间，往往不会严格按标准格式上报，而是直接说一句自然语言报码。你的任务是写一个确定性的程序，把这些短报码归一化成统一 JSON，供主控台直接接入。

## 题目描述

对于每条输入报码，请输出一个 JSON，包含两个字段：

1. `gate_id`：标准化舱门编号
2. `status`：标准化舱门状态

`gate_id` 的格式固定为 `X-YY`：

- `X` 为区域字母，只能是 `E / W / N / S / I / O`
- `YY` 为两位数字编号，例如 `07`、`11`

区域映射规则如下：

- `E`：东环 / 东区 / 东侧
- `W`：西环 / 西区 / 西侧
- `N`：北环 / 北区 / 北侧
- `S`：南环 / 南区 / 南侧
- `I`：主环 / 内环 / 内侧
- `O`：外环 / 外侧

编号规则如下：

1. 需要从文本中识别“几号门”。
2. 阿拉伯数字直接转为整数，例如 `2号门` -> `02`。
3. 中文数字也要识别，例如 `七号门` -> `07`，`十号门` -> `10`，`十一号门` -> `11`，`十二号门` -> `12`。

`status` 只能是以下三种之一：

- `open`
- `closed`
- `fault`

状态按以下优先级判定：

1. 若文本中出现故障语义，如“故障”“打不开”“拉不开”“失灵”“卡住”“异常”“坏了”，则判为 `fault`。
2. 否则，若出现关闭语义，如“关闭”“封闭”“锁住”“关着”“暂停通行”，则判为 `closed`。
3. 否则，若出现开启语义，如“开启”“打开”“恢复通行”“放行”“通了”“重新打开”，则判为 `open`。

也就是说：`fault > closed > open`。

## 你需要实现

在 `submission.py` 中实现：

- `normalize_gate_report_csp(text: str) -> str | dict`

你可以返回 JSON 字符串，也可以返回 Python `dict`，评测器会自动兼容这两种返回方式。

## 输入格式

本题为函数式评测。

评测器会多次调用 `normalize_gate_report_csp(text)`，其中 `text` 表示一条自然语言报码，你可以把它理解为“一行输入”。

## 输出格式

对于每条 `text`，输出一个对象，且必须满足：

1. 只包含 `gate_id`、`status` 两个键。
2. `gate_id` 必须符合 `X-YY` 格式，且编号在 `01` 到 `12` 之间。
3. `status` 必须是 `open / closed / fault` 之一。
4. 若返回字符串，应为合法 JSON。

## 输入输出样例

### 样例输入 1

```text
东侧八号门坏了
```

### 样例输出 1

```json
{"gate_id":"E-08","status":"fault"}
```

说明：`东侧` 映射为 `E`，`八号门` 对应 `08`，`坏了` 属于故障语义，因此 `status` 为 `fault`。

### 样例输入 2

```text
北环十号门暂停通行
```

### 样例输出 2

```json
{"gate_id":"N-10","status":"closed"}
```

说明：`北环` 映射为 `N`，`十号门` 需要标准化为 `10`，`暂停通行` 属于关闭语义，因此 `status` 为 `closed`。

## 数据范围

### 可见数据

1. 文件路径：`../data/T0_test_data.jsonl`
2. 数据规模：共 `8` 条
3. 主要覆盖标准说法，以及阿拉伯数字 / 中文数字混合写法
4. 所有舱门编号均在 `1` 到 `12` 之间

### 隐藏数据

1. 文件路径：`../data/T0_test_data.final.jsonl`
2. 数据规模：共 `4` 条
3. 与可见集保持同一档难度，只是换了一批不同的区域、编号和状态组合
4. 本题特意直接给出这 `4` 条 final data，方便考生更直观地理解区域映射、编号标准化和状态优先级规则
5. 隐藏集不会故意更难，也不会额外加入新的刁钻说法；它只用来检查你的规则是否真正覆盖了同类型输入

## 评分说明

总分 `10` 分，按可见集与隐藏集联合字段准确率计分：

- `gate_id` 命中计 `1` 个字段
- `status` 命中计 `1` 个字段

### 运行方式

```bash
python T0_CSP/evaluate.py
```

### 提示

1. 这题很适合用 NOIP 风格的字符串处理来做。
2. 推荐做法是“关键词表 + 中文数字转整数 + 优先级判定”。
3. 先把 `gate_id` 规则做稳，再处理 `status` 会比较清楚。
