Metadata-Version: 2.5
Name: nonebot-plugin-number-meme
Version: 0.1.1
Summary: 把数字改写成「114514」或「6/7」风格等值表达式的 NoneBot 插件
Project-URL: Homepage, https://github.com/Ltiiatn/nonebot-plugin-number-meme
Project-URL: Repository, https://github.com/Ltiiatn/nonebot-plugin-number-meme
Author: DXXLT
License: MIT
License-File: LICENSE
Keywords: 114514,67,homo,nonebot,nonebot2,number-meme,plugin,six-seven
Classifier: Framework :: Robot Framework
Classifier: Framework :: Robot Framework :: Library
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Requires-Python: >=3.10
Requires-Dist: nonebot-adapter-onebot>=2.4.0
Requires-Dist: nonebot2>=2.4.0
Provides-Extra: dev
Requires-Dist: nonebot2[fastapi]>=2.4.0; extra == 'dev'
Requires-Dist: pytest; extra == 'dev'
Requires-Dist: pytest-asyncio; extra == 'dev'
Requires-Dist: ruff; extra == 'dev'
Description-Content-Type: text/markdown

# nonebot-plugin-number-meme

把数字改写成等值表达式，但只准用固定的数字——一边是 **114514**，一边是 **6 / 7**。

| 命令 | 风格 | 例子 |
| --- | --- | --- |
| `/homo <数字>` | 114514 恶臭数字论证 | `/homo 400` → `400 = -114+514` |
| `/67 <数字>` | Six Seven（只用 6 和 7） | `/67 42` → `42 = 67+6*7-67` |

两条命令共用同一套引擎，只是数据表和梗不同。

## 这是什么

`114514` 和 `six seven` 都是网络数字梗。这个插件把它们变成一个规则：

> 不管你说什么数字，我都用这些数字给你拼回来，**值一分不差**。

`/homo` 只用 `1、1、4、5、1、4` 这些片段，`/67` 只用 `6` 和 `7`。表达式里除了运算符，不会出现别的数字。

<!-- 截图：把群里的效果图存成 docs/screenshot.png，然后取消下面这行注释 -->
<!-- ![效果截图](docs/screenshot.png) -->

## 安装

在 **bot 项目的根目录**下执行（需要先装 `nb-cli`）：

```bash
nb plugin install nonebot-plugin-number-meme
```

或用 pip：

```bash
pip install nonebot-plugin-number-meme
```

安装后在 `.env` 中确认驱动、命令前缀和 OneBot V11 适配器已启用：

```dotenv
DRIVER=~fastapi
COMMAND_START=["/"]
```

## 使用

### /homo —— 114514 风格

```
/homo 400
```

返回：

```
400 = -114+514
```

别名：`/HOMO`。更多例子：

| 输入 | 输出 |
| --- | --- |
| `/homo 0` | `0 = (1-1)*4514` |
| `/homo 114514` | `114514 = 114514` |
| `/homo 1000` | `1000 = 1+14*5*14+1+1+4*5+1-4` |
| `/homo -5` | `-5 = (11-4-5+1-4)*(11-4*5+14)` |

### /67 —— Six Seven 风格

```
/67 42
```

返回：

```
42 = 67+6*7-67
```

别名：`/six-seven`、`/sixseven`。更多例子：

| 输入 | 输出 |
| --- | --- |
| `/67 13` | `13 = 67+6+7-67` |
| `/67 67` | `67 = 67+67-67` |
| `/67 1000` | `1000 = 6*76+76*7+67-6-7-6*7` |
| `/67 3.5` | `3.5 = (6+7/6-7/6/7)/(-6+7-6+7)` |

小数会写成 `(分子)/(分母)` 的形式，分子分母各自用 6、7 表示。

### 怎么验算

输出的表达式可以直接粘到计算器或 Python 里：

```
>>> 6*76+76*7+67-6-7-6*7
1000
```

除法的结果是**精确分数**，不是浮点近似——`67/6-7/6-7` 算出来正好是 `11`。

## 配置

配置项均可选，在 `.env` 中填写即可覆盖：

| 配置项 | 类型 | 默认值 | 说明 |
| --- | --- | --- | --- |
| `HOMO_MAX_INPUT` | int | `1000000000000` | `/homo` 允许输入的绝对值上限 |
| `HOMO_MAX_LENGTH` | int | `2000` | `/homo` 生成表达式的最大字符数 |
| `SEVEN_MAX_INPUT` | int | `10^15` | `/67` 允许输入的绝对值上限 |
| `SEVEN_MAX_LENGTH` | int | `4000` | `/67` 生成表达式的最大字符数 |

示例：

```dotenv
HOMO_MAX_INPUT=100000
SEVEN_MAX_LENGTH=8000
```

## 已知限制

- **支持小数**。`/homo` 写成 `(整数)/(10)^(位数)`，`/67` 写成 `(分子)/(分母)`，两边都精确不丢精度。
- **大数字的输出会很长**。表里没有的数字要靠贪心拼，位数越多拼得越长，所以有 `*_MAX_LENGTH` 兜底。
- **输出不一定最短**。`/67` 追求"6 和 7 多一些"而不是"式子短一些"，`13` 会写成 `67+6+7-67` 而不是更短的 `6+7`，这是有意为之。
- **只支持 OneBot V11**，因为回复用了 `at_sender` 参数。

## 工作原理

两个命令走同一条流水线：

```
数字 → 表里直接有？ → 有就用表里的表达式
      → 没有就取「表里不大于 n 的最大值 v」，n = q*v + r，递归处理 q 和 r
      → 最后统一化简多余的括号
```

```
nonebot_plugin_number_meme/
├── core.py       # 通用引擎：查表 + 贪心分解 + 括号化简
├── homo.py       # 114514 风格：数据表 + 引擎
├── six_seven.py  # 67 风格：数据表 + 引擎
├── config.py     # 配置项
└── __init__.py   # /homo 与 /67 两个命令
```

加一种新风格只需要新增一个文件：照 `homo.py` 的样子放一张表，再在 `__init__.py` 里注册一个命令。

## 开发

```bash
git clone https://github.com/Ltiiatn/nonebot-plugin-number-meme.git
cd nonebot-plugin-number-meme
pip install -e ".[dev]"
pytest
```

测试分两层：纯函数测试（表、算法、数值正确性）和数值不变量测试（表达式算出来必须等于输入）。

## 致谢

- `/homo` 的 114514 数据表参考自 [itorr/homo](https://github.com/itorr/homo)（恶臭数字论证器，MIT License）
  - Copyright (c) 2020 itorr
- `/67` 的数据表整理自 [67676767.net](https://67676767.net/) 的 Six Seven calculator

两个数据集的算法实现均为本项目独立编写。

## 许可证

[MIT](LICENSE)
