mirror of
https://github.com/InternLM/InternBootcamp.git
synced 2026-04-19 12:58:04 +00:00
141 lines
No EOL
4 KiB
Markdown
Executable file
141 lines
No EOL
4 KiB
Markdown
Executable file
# 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` 模块实现高效的谜题生成。
|
||
- **递归算法优化**:减少重复计算,提高解决谜题的效率。
|
||
|
||
--- |