InternBootcamp/internbootcamp/libs/game24/README.md
2025-05-23 15:27:15 +08:00

141 lines
No EOL
4 KiB
Markdown
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Game24Plus - 数学谜题生成与解决工具
`Game24Plus` 是一个用于生成和解决类似于“24点游戏”的数学谜题的 Python 工具。它通过加、减、乘、除四种基本运算,将给定的数字组合成目标数字。该工具支持生成不同数量和范围的数字组合,并提供多种生成方式,包括单进程和多进程并行处理。
---
## 功能特性
- **生成数学谜题**:生成指定数量和范围的数字组合,并通过随机运算生成目标数字。
- **解决谜题**:递归地尝试所有可能的运算组合,找到达到目标数字的解决方案。
- **多进程并行处理**:支持多进程并行生成谜题,提高生成效率。
- **数据保存**:生成的谜题和解决方案以 JSONL 格式保存到文件中。
## 代码结构
### 主要类与方法
#### `Game24Plus` 类
- **`__init__(self, num_numbers, range_max, target_max, seed=None)`**
初始化随机数生成器、数字数量、数字范围、目标数字范围等。
- **`sample_one_number(self, num_min, num_max)`**
生成一个指定范围内的随机整数。
- **`get_numbers(self)`**
生成一组随机整数并排序。
- **`enumerate_all_numbers(self, num_numbers)`**
枚举所有可能的数字组合(递归实现)。
- **`sample_operation(self, numbers)`**
从数字列表中随机选择两个数字和一个运算符,返回运算表达式。
- **`calculate(self, n1, op, n2)`**
根据运算符计算两个数字的结果,处理除法时使用分数。
- **`get_target(self, numbers)`**
通过随机运算将数字列表逐步减少,直到得到一个目标数字,并记录运算过程。
- **`get_target_limit_range(self, numbers)`**
在指定范围内生成目标数字,避免无效结果。
- **`solve(self, numbers, target)`**
递归地尝试所有可能的运算组合,找到达到目标数字的解决方案。
### 主要函数
- **`construct_game24_v1`**
生成指定数量的谜题,并将结果保存为 JSONL 文件。
- **`construct_helper`**
辅助函数,用于生成指定目标范围内的谜题。
- **`construct_game24_v3`**
使用多进程并行生成谜题,提高生成效率。
- **`construct_helper_for_v4`**
辅助函数,用于多进程版本的谜题生成。
- **`construct_game24_v4`**
使用多进程和多队列实现高效的谜题生成。
---
## 使用示例
### 生成谜题
```python
from game24plus import Game24Plus
# 初始化
game = Game24Plus(num_numbers=4, range_max=100, target_max=1000)
# 生成一组数字
numbers = game.get_numbers()
print("生成的数字:", numbers)
# 生成目标数字和运算过程
target, operations = game.get_target_limit_range(numbers)
print("目标数字:", target)
print("运算过程:", operations)
```
### 解决谜题
```python
# 解决谜题
solution = game.solve(numbers, target=24)
if solution:
print("解决方案:", solution)
else:
print("无解")
```
### 批量生成谜题
```bash
python game24plus.py --num_numbers 4 --output_dir data/gameX/raw_1104
```
---
## 参数说明
- **`num_numbers`**:生成谜题的数字数量(默认为 4
- **`range_max`**:生成数字的最大值(默认为 101
- **`target_max`**:目标数字的最大值(默认为 1000
- **`num_samples`**:生成的谜题数量(默认为 200000
- **`seed`**:随机数种子(默认为 1234
- **`num_workers`**:多进程并行处理的工作进程数量(默认为 64
- **`output_dir`**:输出文件的保存目录(默认为当前目录)。
---
## 输出文件格式
生成的谜题和解决方案以 JSONL 格式保存,每行包含一个 JSON 对象,例如:
```json
{
"puzzle": "3 4 6 8",
"target": "24",
"operations": [
["3", "*", "8", "24"],
["4", "+", "6", "10"],
["10", "-", "3", "7"]
]
}
```
---
## 性能优化
- **多进程并行处理**:通过 `multiprocessing` 模块实现高效的谜题生成。
- **递归算法优化**:减少重复计算,提高解决谜题的效率。
---