mahjong-utils


Namemahjong-utils JSON
Version 0.6.6 PyPI version JSON
download
home_pagehttps://github.com/ssttkkl/mahjong-utils
Summary日麻小工具
upload_time2024-02-28 15:23:54
maintainer
docs_urlNone
authorssttkkl
requires_python
licenseMIT
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            mahjong-utils-py
========

[![PyPI version](https://badge.fury.io/py/mahjong-utils.svg)](https://badge.fury.io/py/mahjong-utils)

日麻小工具[ssttkkl/mahjong-utils](https://github.com/ssttkkl/mahjong-utils)的Python绑定

## 安装

```shell
pip install mahjong-utils
```

或通过源码安装(本机必须配置JDK环境用于编译):

```shell
pip install git+https://github.com/ssttkkl/mahjong-utils.git@py
```

## 使用

### 获取番符对应和牌点数

```python
from mahjong_utils.point_by_han_hu import get_parent_point_by_han_hu, get_child_point_by_han_hu

# 获取亲家X番Y符的点数,返回(荣和点数, 自摸各家点数)
parent_ron, parent_tsumo = get_parent_point_by_han_hu(3, 40)
# parent_ron == 7700
# parent_tsumo == 2600

# 获取子家X番Y符的点数,返回(荣和点数, 自摸庄家点数, 自摸闲家点数)
child_ron, child_tsumo_parent, child_tsumo_child = get_child_point_by_han_hu(3, 40)
# child_ron == 5200
# child_tsumo_child == 1300
# child_tsumo_parent == 2600
```

### 手牌向听数、进张分析

```python
from mahjong_utils.models.tile import parse_tiles
from mahjong_utils.shanten import shanten

result = shanten(parse_tiles("34568m235p68s"))
result.shanten
# 1
result.advance
# {3m, 6m, 7m, 8m, 1p, 2p, 3p, 4p, 5p, 6s, 7s, 8s}
```

### 摸牌何切分析
```python
from mahjong_utils.models.tile import parse_tiles
from mahjong_utils.shanten import shanten

result = shanten(parse_tiles("112233p44556s127z"))
result.shanten
# 1
result.discard_to_advance
# {1p: ShantenWithoutGot(shanten=2, advance={2z, 7z, 1p, 4p, 3s, 6s, 1z}, advance_num=22, good_shape_advance=None, good_shape_advance_num=None),
# 2p: ShantenWithoutGot(shanten=2, advance={2z, 7z, 2p, 3s, 6s, 1z}, advance_num=18, good_shape_advance=None, good_shape_advance_num=None),
# 3p: ShantenWithoutGot(shanten=2, advance={2z, 7z, 3p, 3s, 6s, 1z}, advance_num=18, good_shape_advance=None, good_shape_advance_num=None),
# 4s: ShantenWithoutGot(shanten=2, advance={2z, 7z, 3s, 4s, 5s, 6s, 7s, 1z}, advance_num=24, good_shape_advance=None, good_shape_advance_num=None),
# 5s: ShantenWithoutGot(shanten=2, advance={2z, 7z, 2s, 3s, 4s, 5s, 6s, 1z}, advance_num=24, good_shape_advance=None, good_shape_advance_num=None),
# 6s: ShantenWithoutGot(shanten=1, advance={2z, 7z, 1z}, advance_num=9, good_shape_advance=set(), good_shape_advance_num=0),
# 1z: ShantenWithoutGot(shanten=1, advance={2z, 6s, 7z, 3s}, advance_num=13, good_shape_advance={2z, 7z}, good_shape_advance_num=6),
# 2z: ShantenWithoutGot(shanten=1, advance={6s, 3s, 7z, 1z}, advance_num=13, good_shape_advance={7z, 1z}, good_shape_advance_num=6),
# 7z: ShantenWithoutGot(shanten=1, advance={2z, 6s, 3s, 1z}, advance_num=13, good_shape_advance={2z, 1z}, good_shape_advance_num=6)}
```

### 鸣牌分析
```python
from mahjong_utils.models.tile import parse_tiles, Tile
from mahjong_utils.shanten import furo_chance_shanten

result = furo_chance_shanten(parse_tiles("3456778m123457p"),
                             Tile.by_text("7m"))
result.shanten
# 0
result.shanten_info.chi
# {56m: ShantenWithGot(shanten=1, discard_to_advance={
#   8m: ShantenWithoutGot(shanten=1, advance={6p, 2m, 5m, 3p}, advance_num=15, good_shape_advance={6p, 2m, 5m, 3p}, good_shape_advance_num=15), 
#   7p: ShantenWithoutGot(shanten=1, advance={6p, 2m, 5m, 3p}, advance_num=15, good_shape_advance={6p, 2m, 5m, 3p}, good_shape_advance_num=15), 
#   4p: ShantenWithoutGot(shanten=1, advance={6p, 2m, 5m}, advance_num=12, good_shape_advance={6p}, good_shape_advance_num=4), 
#   1p: ShantenWithoutGot(shanten=1, advance={6p, 2m, 5m}, advance_num=12, good_shape_advance={6p}, good_shape_advance_num=4), 
#   3m: ShantenWithoutGot(shanten=2, advance={2m, 3m, 4m, 5m, 6m, 7m, 8m, 9m, 1p, 2p, 3p, 4p, 5p, 6p, 7p, 8p, 9p}, advance_num=57, good_shape_advance=None, good_shape_advance_num=None),
#   4m: ShantenWithoutGot(shanten=2, advance={1m, 2m, 3m, 4m, 5m, 6m, 7m, 8m, 9m, 1p, 2p, 3p, 4p, 5p, 6p, 7p, 8p, 9p}, advance_num=61, good_shape_advance=None, good_shape_advance_num=None), 
#   7m: ShantenWithoutGot(shanten=2, advance={2m, 3m, 4m, 5m, 6m, 7m, 8m, 9m, 1p, 2p, 3p, 4p, 5p, 6p, 7p}, advance_num=49, good_shape_advance=None, good_shape_advance_num=None), 
#   2p: ShantenWithoutGot(shanten=2, advance={2m, 5m, 6m, 7m, 8m, 9m, 1p, 2p, 3p, 5p, 6p, 7p, 8p, 9p}, advance_num=48, good_shape_advance=None, good_shape_advance_num=None),
#   3p: ShantenWithoutGot(shanten=2, advance={6p, 2m, 5m, 3p}, advance_num=15, good_shape_advance=None, good_shape_advance_num=None), 
#   5p: ShantenWithoutGot(shanten=2, advance={2m, 5m, 6m, 7m, 8m, 9m, 1p, 2p, 3p, 4p, 5p, 6p, 7p, 8p, 9p}, advance_num=51, good_shape_advance=None, good_shape_advance_num=None)}, ankan_to_advance={}), 
# 68m: ShantenWithGot(shanten=0, discard_to_advance={
#   7p: ShantenWithoutGot(shanten=0, advance={6p, 3p}, advance_num=7, good_shape_advance=None, good_shape_advance_num=None), 
#   4p: ShantenWithoutGot(shanten=0, advance={6p}, advance_num=4, good_shape_advance=None, good_shape_advance_num=None), 
#   1p: ShantenWithoutGot(shanten=0, advance={6p}, advance_num=4, good_shape_advance=None, good_shape_advance_num=None), 
#   3m: ShantenWithoutGot(shanten=1, advance={6p, 3m, 3p, 6m}, advance_num=14, good_shape_advance={6p, 3m, 3p, 6m}, good_shape_advance_num=14),
#   4m: ShantenWithoutGot(shanten=1, advance={6p, 4m, 3p}, advance_num=10, good_shape_advance={4m}, good_shape_advance_num=3), 
#   5m: ShantenWithoutGot(shanten=1, advance={6p, 2m, 5m, 3p}, advance_num=14, good_shape_advance={6p, 2m, 5m, 3p}, good_shape_advance_num=14), 
#   7m: ShantenWithoutGot(shanten=1, advance={7m, 1p, 3p, 4p, 6p, 7p}, advance_num=18, good_shape_advance={6p, 7p, 7m}, good_shape_advance_num=9), 
#   2p: ShantenWithoutGot(shanten=1, advance={1p, 2p, 3p, 5p, 6p, 7p, 8p, 9p}, advance_num=27, good_shape_advance={6p, 8p, 2p}, good_shape_advance_num=11),
#   3p: ShantenWithoutGot(shanten=1, advance={6p, 3p}, advance_num=7, good_shape_advance={3p}, good_shape_advance_num=3),
#   5p: ShantenWithoutGot(shanten=1, advance={1p, 2p, 3p, 4p, 5p, 6p, 7p, 8p, 9p}, advance_num=30, good_shape_advance={6p, 8p, 3p, 5p}, good_shape_advance_num=14)}, ankan_to_advance={})}

result.shanten_info.pon
# ShantenWithGot(shanten=1, discard_to_advance={
#   7p: ShantenWithoutGot(shanten=1, advance={3m, 6m, 7m, 8m, 1p, 2p, 3p, 4p, 5p, 6p}, advance_num=32, good_shape_advance={3m, 6m, 7m, 8m, 3p, 6p}, good_shape_advance_num=20), 
#   4p: ShantenWithoutGot(shanten=1, advance={3m, 6m, 7m, 8m, 5p, 6p, 7p}, advance_num=23, good_shape_advance={6p}, good_shape_advance_num=4), 
#   5p: ShantenWithoutGot(shanten=1, advance={7p, 1p, 4p, 7m}, advance_num=13, good_shape_advance={7m}, good_shape_advance_num=4), 
#   6m: ShantenWithoutGot(shanten=1, advance={8m, 1p, 3p, 4p, 6p, 7p}, advance_num=19, good_shape_advance={6p, 7p, 8m}, good_shape_advance_num=10), 
#   8m: ShantenWithoutGot(shanten=1, advance={3m, 6m, 1p, 3p, 4p, 6p, 7p}, advance_num=22, good_shape_advance={3m, 6m, 3p, 6p, 7p}, good_shape_advance_num=16), 
#   1p: ShantenWithoutGot(shanten=1, advance={3m, 6m, 7m, 8m, 2p, 5p, 6p, 7p}, advance_num=26, good_shape_advance={6p, 7m}, good_shape_advance_num=8), 
#   2p: ShantenWithoutGot(shanten=1, advance={7p, 1p, 7m}, advance_num=10, good_shape_advance=set(), good_shape_advance_num=0), 
#   3m: ShantenWithoutGot(shanten=1, advance={8m, 1p, 3p, 4p, 6p, 7p}, advance_num=19, good_shape_advance={6p, 8m, 7p}, good_shape_advance_num=10), 
#   4m: ShantenWithoutGot(shanten=2, advance={3m, 4m, 5m, 6m, 7m, 8m, 1p, 2p, 3p, 4p, 5p, 6p, 7p}, advance_num=41, good_shape_advance=None, good_shape_advance_num=None), 
#   5m: ShantenWithoutGot(shanten=2, advance={2m, 3m, 4m, 5m, 6m, 7m, 8m, 1p, 2p, 3p, 4p, 5p, 6p, 7p}, advance_num=45, good_shape_advance=None, good_shape_advance_num=None), 
#   3p: ShantenWithoutGot(shanten=2, advance={3m, 6m, 7m, 8m, 1p, 2p, 3p, 4p, 5p, 6p, 7p}, advance_num=35, good_shape_advance=None, good_shape_advance_num=None)}, ankan_to_advance={})

result.shanten_info.pass_
# ShantenWithoutGot(shanten=1, advance={7m, 1p, 3p, 4p, 6p, 7p}, advance_num=18, good_shape_advance={6p, 7p, 7m}, good_shape_advance_num=9)

result.shanten_info.minkan
# None
```

### 和了分析

```python
from mahjong_utils.hora import build_hora
from mahjong_utils.models.tile import parse_tiles, Tile
from mahjong_utils.models.wind import Wind
from mahjong_utils.models.furo import Furo
from mahjong_utils.yaku.common import self_wind, round_wind

# 和了分析
hora = build_hora(
    tiles=parse_tiles("12233466m111z"),
    furo=[Furo.parse("789p")],
    agari=Tile.by_text("1z"),
    tsumo=True,
    dora=4,
    self_wind=Wind.east,
    round_wind=Wind.east
)

# hora.yaku == {self_wind, round_wind}
# hora.han == 6
# hora.hu == 30
# hora.parent_point == (18000, 6000)
# hora.child_point == (12000, 6000, 3000)
```

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/ssttkkl/mahjong-utils",
    "name": "mahjong-utils",
    "maintainer": "",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "",
    "keywords": "",
    "author": "ssttkkl",
    "author_email": "huang.wen.long@hotmail.com",
    "download_url": "https://files.pythonhosted.org/packages/7e/7c/8078f90cca1afe414a3e46da26fce02f647cdb6aeeb183999c9c96dd6d45/mahjong-utils-0.6.6.tar.gz",
    "platform": null,
    "description": "mahjong-utils-py\n========\n\n[![PyPI version](https://badge.fury.io/py/mahjong-utils.svg)](https://badge.fury.io/py/mahjong-utils)\n\n\u65e5\u9ebb\u5c0f\u5de5\u5177[ssttkkl/mahjong-utils](https://github.com/ssttkkl/mahjong-utils)\u7684Python\u7ed1\u5b9a\n\n## \u5b89\u88c5\n\n```shell\npip install mahjong-utils\n```\n\n\u6216\u901a\u8fc7\u6e90\u7801\u5b89\u88c5\uff08\u672c\u673a\u5fc5\u987b\u914d\u7f6eJDK\u73af\u5883\u7528\u4e8e\u7f16\u8bd1\uff09\uff1a\n\n```shell\npip install git+https://github.com/ssttkkl/mahjong-utils.git@py\n```\n\n## \u4f7f\u7528\n\n### \u83b7\u53d6\u756a\u7b26\u5bf9\u5e94\u548c\u724c\u70b9\u6570\n\n```python\nfrom mahjong_utils.point_by_han_hu import get_parent_point_by_han_hu, get_child_point_by_han_hu\n\n# \u83b7\u53d6\u4eb2\u5bb6X\u756aY\u7b26\u7684\u70b9\u6570\uff0c\u8fd4\u56de(\u8363\u548c\u70b9\u6570, \u81ea\u6478\u5404\u5bb6\u70b9\u6570)\nparent_ron, parent_tsumo = get_parent_point_by_han_hu(3, 40)\n# parent_ron == 7700\n# parent_tsumo == 2600\n\n# \u83b7\u53d6\u5b50\u5bb6X\u756aY\u7b26\u7684\u70b9\u6570\uff0c\u8fd4\u56de(\u8363\u548c\u70b9\u6570, \u81ea\u6478\u5e84\u5bb6\u70b9\u6570, \u81ea\u6478\u95f2\u5bb6\u70b9\u6570)\nchild_ron, child_tsumo_parent, child_tsumo_child = get_child_point_by_han_hu(3, 40)\n# child_ron == 5200\n# child_tsumo_child == 1300\n# child_tsumo_parent == 2600\n```\n\n### \u624b\u724c\u5411\u542c\u6570\u3001\u8fdb\u5f20\u5206\u6790\n\n```python\nfrom mahjong_utils.models.tile import parse_tiles\nfrom mahjong_utils.shanten import shanten\n\nresult = shanten(parse_tiles(\"34568m235p68s\"))\nresult.shanten\n# 1\nresult.advance\n# {3m, 6m, 7m, 8m, 1p, 2p, 3p, 4p, 5p, 6s, 7s, 8s}\n```\n\n### \u6478\u724c\u4f55\u5207\u5206\u6790\n```python\nfrom mahjong_utils.models.tile import parse_tiles\nfrom mahjong_utils.shanten import shanten\n\nresult = shanten(parse_tiles(\"112233p44556s127z\"))\nresult.shanten\n# 1\nresult.discard_to_advance\n# {1p: ShantenWithoutGot(shanten=2, advance={2z, 7z, 1p, 4p, 3s, 6s, 1z}, advance_num=22, good_shape_advance=None, good_shape_advance_num=None),\n# 2p: ShantenWithoutGot(shanten=2, advance={2z, 7z, 2p, 3s, 6s, 1z}, advance_num=18, good_shape_advance=None, good_shape_advance_num=None),\n# 3p: ShantenWithoutGot(shanten=2, advance={2z, 7z, 3p, 3s, 6s, 1z}, advance_num=18, good_shape_advance=None, good_shape_advance_num=None),\n# 4s: ShantenWithoutGot(shanten=2, advance={2z, 7z, 3s, 4s, 5s, 6s, 7s, 1z}, advance_num=24, good_shape_advance=None, good_shape_advance_num=None),\n# 5s: ShantenWithoutGot(shanten=2, advance={2z, 7z, 2s, 3s, 4s, 5s, 6s, 1z}, advance_num=24, good_shape_advance=None, good_shape_advance_num=None),\n# 6s: ShantenWithoutGot(shanten=1, advance={2z, 7z, 1z}, advance_num=9, good_shape_advance=set(), good_shape_advance_num=0),\n# 1z: ShantenWithoutGot(shanten=1, advance={2z, 6s, 7z, 3s}, advance_num=13, good_shape_advance={2z, 7z}, good_shape_advance_num=6),\n# 2z: ShantenWithoutGot(shanten=1, advance={6s, 3s, 7z, 1z}, advance_num=13, good_shape_advance={7z, 1z}, good_shape_advance_num=6),\n# 7z: ShantenWithoutGot(shanten=1, advance={2z, 6s, 3s, 1z}, advance_num=13, good_shape_advance={2z, 1z}, good_shape_advance_num=6)}\n```\n\n### \u9e23\u724c\u5206\u6790\n```python\nfrom mahjong_utils.models.tile import parse_tiles, Tile\nfrom mahjong_utils.shanten import furo_chance_shanten\n\nresult = furo_chance_shanten(parse_tiles(\"3456778m123457p\"),\n                             Tile.by_text(\"7m\"))\nresult.shanten\n# 0\nresult.shanten_info.chi\n# {56m: ShantenWithGot(shanten=1, discard_to_advance={\n#   8m: ShantenWithoutGot(shanten=1, advance={6p, 2m, 5m, 3p}, advance_num=15, good_shape_advance={6p, 2m, 5m, 3p}, good_shape_advance_num=15), \n#   7p: ShantenWithoutGot(shanten=1, advance={6p, 2m, 5m, 3p}, advance_num=15, good_shape_advance={6p, 2m, 5m, 3p}, good_shape_advance_num=15), \n#   4p: ShantenWithoutGot(shanten=1, advance={6p, 2m, 5m}, advance_num=12, good_shape_advance={6p}, good_shape_advance_num=4), \n#   1p: ShantenWithoutGot(shanten=1, advance={6p, 2m, 5m}, advance_num=12, good_shape_advance={6p}, good_shape_advance_num=4), \n#   3m: ShantenWithoutGot(shanten=2, advance={2m, 3m, 4m, 5m, 6m, 7m, 8m, 9m, 1p, 2p, 3p, 4p, 5p, 6p, 7p, 8p, 9p}, advance_num=57, good_shape_advance=None, good_shape_advance_num=None),\n#   4m: ShantenWithoutGot(shanten=2, advance={1m, 2m, 3m, 4m, 5m, 6m, 7m, 8m, 9m, 1p, 2p, 3p, 4p, 5p, 6p, 7p, 8p, 9p}, advance_num=61, good_shape_advance=None, good_shape_advance_num=None), \n#   7m: ShantenWithoutGot(shanten=2, advance={2m, 3m, 4m, 5m, 6m, 7m, 8m, 9m, 1p, 2p, 3p, 4p, 5p, 6p, 7p}, advance_num=49, good_shape_advance=None, good_shape_advance_num=None), \n#   2p: ShantenWithoutGot(shanten=2, advance={2m, 5m, 6m, 7m, 8m, 9m, 1p, 2p, 3p, 5p, 6p, 7p, 8p, 9p}, advance_num=48, good_shape_advance=None, good_shape_advance_num=None),\n#   3p: ShantenWithoutGot(shanten=2, advance={6p, 2m, 5m, 3p}, advance_num=15, good_shape_advance=None, good_shape_advance_num=None), \n#   5p: ShantenWithoutGot(shanten=2, advance={2m, 5m, 6m, 7m, 8m, 9m, 1p, 2p, 3p, 4p, 5p, 6p, 7p, 8p, 9p}, advance_num=51, good_shape_advance=None, good_shape_advance_num=None)}, ankan_to_advance={}), \n# 68m: ShantenWithGot(shanten=0, discard_to_advance={\n#   7p: ShantenWithoutGot(shanten=0, advance={6p, 3p}, advance_num=7, good_shape_advance=None, good_shape_advance_num=None), \n#   4p: ShantenWithoutGot(shanten=0, advance={6p}, advance_num=4, good_shape_advance=None, good_shape_advance_num=None), \n#   1p: ShantenWithoutGot(shanten=0, advance={6p}, advance_num=4, good_shape_advance=None, good_shape_advance_num=None), \n#   3m: ShantenWithoutGot(shanten=1, advance={6p, 3m, 3p, 6m}, advance_num=14, good_shape_advance={6p, 3m, 3p, 6m}, good_shape_advance_num=14),\n#   4m: ShantenWithoutGot(shanten=1, advance={6p, 4m, 3p}, advance_num=10, good_shape_advance={4m}, good_shape_advance_num=3), \n#   5m: ShantenWithoutGot(shanten=1, advance={6p, 2m, 5m, 3p}, advance_num=14, good_shape_advance={6p, 2m, 5m, 3p}, good_shape_advance_num=14), \n#   7m: ShantenWithoutGot(shanten=1, advance={7m, 1p, 3p, 4p, 6p, 7p}, advance_num=18, good_shape_advance={6p, 7p, 7m}, good_shape_advance_num=9), \n#   2p: ShantenWithoutGot(shanten=1, advance={1p, 2p, 3p, 5p, 6p, 7p, 8p, 9p}, advance_num=27, good_shape_advance={6p, 8p, 2p}, good_shape_advance_num=11),\n#   3p: ShantenWithoutGot(shanten=1, advance={6p, 3p}, advance_num=7, good_shape_advance={3p}, good_shape_advance_num=3),\n#   5p: ShantenWithoutGot(shanten=1, advance={1p, 2p, 3p, 4p, 5p, 6p, 7p, 8p, 9p}, advance_num=30, good_shape_advance={6p, 8p, 3p, 5p}, good_shape_advance_num=14)}, ankan_to_advance={})}\n\nresult.shanten_info.pon\n# ShantenWithGot(shanten=1, discard_to_advance={\n#   7p: ShantenWithoutGot(shanten=1, advance={3m, 6m, 7m, 8m, 1p, 2p, 3p, 4p, 5p, 6p}, advance_num=32, good_shape_advance={3m, 6m, 7m, 8m, 3p, 6p}, good_shape_advance_num=20), \n#   4p: ShantenWithoutGot(shanten=1, advance={3m, 6m, 7m, 8m, 5p, 6p, 7p}, advance_num=23, good_shape_advance={6p}, good_shape_advance_num=4), \n#   5p: ShantenWithoutGot(shanten=1, advance={7p, 1p, 4p, 7m}, advance_num=13, good_shape_advance={7m}, good_shape_advance_num=4), \n#   6m: ShantenWithoutGot(shanten=1, advance={8m, 1p, 3p, 4p, 6p, 7p}, advance_num=19, good_shape_advance={6p, 7p, 8m}, good_shape_advance_num=10), \n#   8m: ShantenWithoutGot(shanten=1, advance={3m, 6m, 1p, 3p, 4p, 6p, 7p}, advance_num=22, good_shape_advance={3m, 6m, 3p, 6p, 7p}, good_shape_advance_num=16), \n#   1p: ShantenWithoutGot(shanten=1, advance={3m, 6m, 7m, 8m, 2p, 5p, 6p, 7p}, advance_num=26, good_shape_advance={6p, 7m}, good_shape_advance_num=8), \n#   2p: ShantenWithoutGot(shanten=1, advance={7p, 1p, 7m}, advance_num=10, good_shape_advance=set(), good_shape_advance_num=0), \n#   3m: ShantenWithoutGot(shanten=1, advance={8m, 1p, 3p, 4p, 6p, 7p}, advance_num=19, good_shape_advance={6p, 8m, 7p}, good_shape_advance_num=10), \n#   4m: ShantenWithoutGot(shanten=2, advance={3m, 4m, 5m, 6m, 7m, 8m, 1p, 2p, 3p, 4p, 5p, 6p, 7p}, advance_num=41, good_shape_advance=None, good_shape_advance_num=None), \n#   5m: ShantenWithoutGot(shanten=2, advance={2m, 3m, 4m, 5m, 6m, 7m, 8m, 1p, 2p, 3p, 4p, 5p, 6p, 7p}, advance_num=45, good_shape_advance=None, good_shape_advance_num=None), \n#   3p: ShantenWithoutGot(shanten=2, advance={3m, 6m, 7m, 8m, 1p, 2p, 3p, 4p, 5p, 6p, 7p}, advance_num=35, good_shape_advance=None, good_shape_advance_num=None)}, ankan_to_advance={})\n\nresult.shanten_info.pass_\n# ShantenWithoutGot(shanten=1, advance={7m, 1p, 3p, 4p, 6p, 7p}, advance_num=18, good_shape_advance={6p, 7p, 7m}, good_shape_advance_num=9)\n\nresult.shanten_info.minkan\n# None\n```\n\n### \u548c\u4e86\u5206\u6790\n\n```python\nfrom mahjong_utils.hora import build_hora\nfrom mahjong_utils.models.tile import parse_tiles, Tile\nfrom mahjong_utils.models.wind import Wind\nfrom mahjong_utils.models.furo import Furo\nfrom mahjong_utils.yaku.common import self_wind, round_wind\n\n# \u548c\u4e86\u5206\u6790\nhora = build_hora(\n    tiles=parse_tiles(\"12233466m111z\"),\n    furo=[Furo.parse(\"789p\")],\n    agari=Tile.by_text(\"1z\"),\n    tsumo=True,\n    dora=4,\n    self_wind=Wind.east,\n    round_wind=Wind.east\n)\n\n# hora.yaku == {self_wind, round_wind}\n# hora.han == 6\n# hora.hu == 30\n# hora.parent_point == (18000, 6000)\n# hora.child_point == (12000, 6000, 3000)\n```\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "\u65e5\u9ebb\u5c0f\u5de5\u5177",
    "version": "0.6.6",
    "project_urls": {
        "Homepage": "https://github.com/ssttkkl/mahjong-utils"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6c6b7c98715513829f642412cf09913d05d6e7ef5d5c5e49f68564c46bcef64a",
                "md5": "72c0d1d5a9304063830e80b25d5a87eb",
                "sha256": "c01c624931be7a1e250b67b740ce12ed8d2433ecd018190867d89cc91b85b89b"
            },
            "downloads": -1,
            "filename": "mahjong_utils-0.6.6-py3-none-macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "72c0d1d5a9304063830e80b25d5a87eb",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 742572,
            "upload_time": "2024-02-28T15:23:48",
            "upload_time_iso_8601": "2024-02-28T15:23:48.791795Z",
            "url": "https://files.pythonhosted.org/packages/6c/6b/7c98715513829f642412cf09913d05d6e7ef5d5c5e49f68564c46bcef64a/mahjong_utils-0.6.6-py3-none-macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "956413ee6f0c9bcb19550e83a599354da525aaec2aad21a1e249ccbb3b3492aa",
                "md5": "8a2557d25dcec17d6a7ccda90245f492",
                "sha256": "56264bef4d64466667a48fa2399d99797e2fa7f5536d2e7aa3803b3fbe746633"
            },
            "downloads": -1,
            "filename": "mahjong_utils-0.6.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "8a2557d25dcec17d6a7ccda90245f492",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 889882,
            "upload_time": "2024-02-28T15:23:51",
            "upload_time_iso_8601": "2024-02-28T15:23:51.286318Z",
            "url": "https://files.pythonhosted.org/packages/95/64/13ee6f0c9bcb19550e83a599354da525aaec2aad21a1e249ccbb3b3492aa/mahjong_utils-0.6.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "193e58b3bb29f6b6c415cf2463e9a815feeb596885a211c887067f63c665a063",
                "md5": "b8df919ad3cc9d81249aafecce409605",
                "sha256": "bd4bb737c68f73faf4eadf39723a0faeeb051b0a7eb110c1c961ce8a93a84bf7"
            },
            "downloads": -1,
            "filename": "mahjong_utils-0.6.6-py3-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "b8df919ad3cc9d81249aafecce409605",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 947534,
            "upload_time": "2024-02-28T15:23:52",
            "upload_time_iso_8601": "2024-02-28T15:23:52.827623Z",
            "url": "https://files.pythonhosted.org/packages/19/3e/58b3bb29f6b6c415cf2463e9a815feeb596885a211c887067f63c665a063/mahjong_utils-0.6.6-py3-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7e7c8078f90cca1afe414a3e46da26fce02f647cdb6aeeb183999c9c96dd6d45",
                "md5": "f12bab37220e760a5f438548ac4dcc9a",
                "sha256": "71acafdd95c03801aa71429dba6aed58e04407f249b50bb9e29c8ed3fe11ad5b"
            },
            "downloads": -1,
            "filename": "mahjong-utils-0.6.6.tar.gz",
            "has_sig": false,
            "md5_digest": "f12bab37220e760a5f438548ac4dcc9a",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 245847,
            "upload_time": "2024-02-28T15:23:54",
            "upload_time_iso_8601": "2024-02-28T15:23:54.401798Z",
            "url": "https://files.pythonhosted.org/packages/7e/7c/8078f90cca1afe414a3e46da26fce02f647cdb6aeeb183999c9c96dd6d45/mahjong-utils-0.6.6.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-02-28 15:23:54",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "ssttkkl",
    "github_project": "mahjong-utils",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "mahjong-utils"
}
        
Elapsed time: 0.21699s