麻雀の清一色の二向聴について調べてみた
はじめに
以前 Qiita で下記の記事を書いた。今度は清一色手の向聴数について調べようと思う。
準備
今回することは、向聴数のパターン数を調べ上げた後、二向聴について分類をしていく。
ただ、パターン数については らすかるの家 で他の人によって計算されている。今回は確認用として使わせていただく。
(このサイトは他の確率であったり、麻雀のルールが細かくまとめられていて面白い)
パターン数の求め方
上記サイトを参照すると悪くても二向聴なので、聴牌や一向聴ではない配牌なら二向聴とすることによって簡略化した。コードについては、友人としゃべりながら1時時間半ほどで適当に書いたもので、到底載せれるものじゃないので隠しておく(笑)
流れとしては下記の通り
- 14枚の牌が和了形であるかを判定する関数 isAgari() を作る
- 13枚の牌が聴牌形であるかを判定する関数 isTempai() を作る
- 13枚の牌の向聴数を求める関数 getShantenNumber() を作る
- 全部の有効な配牌に対して向聴数を計算していく
実行結果はサイトと同じ値となった。
ならない時は isAgari() で七対子が考慮されているか見てみよう。経験談。
ここで出たパターンは平行移動や反転したものも混じっている。なのでそれらを省きたい。前回と同様に標準形を考える。
(前回の標準形は牌の最小数が2であるものとしたが今回は1として進める)
ここで考慮しないといけないのが、ある配牌とその標準形で向聴数が違うものがないかである。これも確認するプログラムを作って、実際そのような配牌はないことが確認できた。
標準形の数は下記の数になった。
パターン数 | 標準形数 | |
---|---|---|
聴牌 | 40196 | 4076 |
一向聴 | 52791 | 5436 |
二向聴 | 613 | 92 |
今回は二向聴の標準形である 92 パターンの分類をしていく。
二向聴の標準形の分類
92 パターンの一覧。文字列の読み方は1から9までの牌がそれぞれ何枚ずつ持っているかで表記している。
例) 430210021 -> 🀐🀐🀐🀐🀑🀑🀑🀓🀓🀔🀗🀗🀘
文字列での一覧
430210021
430210012
430120021
430120012
420321001
420312001
420310021
420310012
420240001
420220210
420220120
420220021
420220012
420210220
420210040
420210022
420210013
420210004
420202021
420202012
420201022
420201004
420121021
420121012
420120022
420040021
420040012
420010024
410400400
410400040
410400004
410040004
402202201
402202102
402201202
402201004
401400400
401400040
401400004
401040004
400410040
400410004
400401004
400221004
400212004
400140004
240310021
240310012
240220210
240220120
240220021
240220012
240210220
240210022
240202021
240202012
240201022
240121021
240121012
240120022
240040021
240040012
240010042
220420210
220420120
220420021
220420012
220410220
220410022
220402021
220402012
220401022
220240021
220240012
220140022
210421012
210340012
210313012
204202201
204202102
204201202
202402201
202402102
202401202
130420210
130420021
130402021
130240021
120421021
120340021
120313021
103402201
牌姿による一覧
🀐🀐🀐🀐🀑🀑🀑🀓🀓🀔🀗🀗🀘
🀐🀐🀐🀐🀑🀑🀑🀓🀓🀔🀗🀘🀘
🀐🀐🀐🀐🀑🀑🀑🀓🀔🀔🀗🀗🀘
🀐🀐🀐🀐🀑🀑🀑🀓🀔🀔🀗🀘🀘
🀐🀐🀐🀐🀑🀑🀓🀓🀓🀔🀔🀕🀘
🀐🀐🀐🀐🀑🀑🀓🀓🀓🀔🀕🀕🀘
🀐🀐🀐🀐🀑🀑🀓🀓🀓🀔🀗🀗🀘
🀐🀐🀐🀐🀑🀑🀓🀓🀓🀔🀗🀘🀘
🀐🀐🀐🀐🀑🀑🀓🀓🀔🀔🀔🀔🀘
🀐🀐🀐🀐🀑🀑🀓🀓🀔🀔🀖🀖🀗
🀐🀐🀐🀐🀑🀑🀓🀓🀔🀔🀖🀗🀗
🀐🀐🀐🀐🀑🀑🀓🀓🀔🀔🀗🀗🀘
🀐🀐🀐🀐🀑🀑🀓🀓🀔🀔🀗🀘🀘
🀐🀐🀐🀐🀑🀑🀓🀓🀔🀖🀖🀗🀗
🀐🀐🀐🀐🀑🀑🀓🀓🀔🀗🀗🀗🀗
🀐🀐🀐🀐🀑🀑🀓🀓🀔🀗🀗🀘🀘
🀐🀐🀐🀐🀑🀑🀓🀓🀔🀗🀘🀘🀘
🀐🀐🀐🀐🀑🀑🀓🀓🀔🀘🀘🀘🀘
🀐🀐🀐🀐🀑🀑🀓🀓🀕🀕🀗🀗🀘
🀐🀐🀐🀐🀑🀑🀓🀓🀕🀕🀗🀘🀘
🀐🀐🀐🀐🀑🀑🀓🀓🀕🀗🀗🀘🀘
🀐🀐🀐🀐🀑🀑🀓🀓🀕🀘🀘🀘🀘
🀐🀐🀐🀐🀑🀑🀓🀔🀔🀕🀗🀗🀘
🀐🀐🀐🀐🀑🀑🀓🀔🀔🀕🀗🀘🀘
🀐🀐🀐🀐🀑🀑🀓🀔🀔🀗🀗🀘🀘
🀐🀐🀐🀐🀑🀑🀔🀔🀔🀔🀗🀗🀘
🀐🀐🀐🀐🀑🀑🀔🀔🀔🀔🀗🀘🀘
🀐🀐🀐🀐🀑🀑🀔🀗🀗🀘🀘🀘🀘
🀐🀐🀐🀐🀑🀓🀓🀓🀓🀖🀖🀖🀖
🀐🀐🀐🀐🀑🀓🀓🀓🀓🀗🀗🀗🀗
🀐🀐🀐🀐🀑🀓🀓🀓🀓🀘🀘🀘🀘
🀐🀐🀐🀐🀑🀔🀔🀔🀔🀘🀘🀘🀘
🀐🀐🀐🀐🀒🀒🀓🀓🀕🀕🀖🀖🀘
🀐🀐🀐🀐🀒🀒🀓🀓🀕🀕🀖🀘🀘
🀐🀐🀐🀐🀒🀒🀓🀓🀕🀖🀖🀘🀘
🀐🀐🀐🀐🀒🀒🀓🀓🀕🀘🀘🀘🀘
🀐🀐🀐🀐🀒🀓🀓🀓🀓🀖🀖🀖🀖
🀐🀐🀐🀐🀒🀓🀓🀓🀓🀗🀗🀗🀗
🀐🀐🀐🀐🀒🀓🀓🀓🀓🀘🀘🀘🀘
🀐🀐🀐🀐🀒🀔🀔🀔🀔🀘🀘🀘🀘
🀐🀐🀐🀐🀓🀓🀓🀓🀔🀗🀗🀗🀗
🀐🀐🀐🀐🀓🀓🀓🀓🀔🀘🀘🀘🀘
🀐🀐🀐🀐🀓🀓🀓🀓🀕🀘🀘🀘🀘
🀐🀐🀐🀐🀓🀓🀔🀔🀕🀘🀘🀘🀘
🀐🀐🀐🀐🀓🀓🀔🀕🀕🀘🀘🀘🀘
🀐🀐🀐🀐🀓🀔🀔🀔🀔🀘🀘🀘🀘
🀐🀐🀑🀑🀑🀑🀓🀓🀓🀔🀗🀗🀘
🀐🀐🀑🀑🀑🀑🀓🀓🀓🀔🀗🀘🀘
🀐🀐🀑🀑🀑🀑🀓🀓🀔🀔🀖🀖🀗
🀐🀐🀑🀑🀑🀑🀓🀓🀔🀔🀖🀗🀗
🀐🀐🀑🀑🀑🀑🀓🀓🀔🀔🀗🀗🀘
🀐🀐🀑🀑🀑🀑🀓🀓🀔🀔🀗🀘🀘
🀐🀐🀑🀑🀑🀑🀓🀓🀔🀖🀖🀗🀗
🀐🀐🀑🀑🀑🀑🀓🀓🀔🀗🀗🀘🀘
🀐🀐🀑🀑🀑🀑🀓🀓🀕🀕🀗🀗🀘
🀐🀐🀑🀑🀑🀑🀓🀓🀕🀕🀗🀘🀘
🀐🀐🀑🀑🀑🀑🀓🀓🀕🀗🀗🀘🀘
🀐🀐🀑🀑🀑🀑🀓🀔🀔🀕🀗🀗🀘
🀐🀐🀑🀑🀑🀑🀓🀔🀔🀕🀗🀘🀘
🀐🀐🀑🀑🀑🀑🀓🀔🀔🀗🀗🀘🀘
🀐🀐🀑🀑🀑🀑🀔🀔🀔🀔🀗🀗🀘
🀐🀐🀑🀑🀑🀑🀔🀔🀔🀔🀗🀘🀘
🀐🀐🀑🀑🀑🀑🀔🀗🀗🀗🀗🀘🀘
🀐🀐🀑🀑🀓🀓🀓🀓🀔🀔🀖🀖🀗
🀐🀐🀑🀑🀓🀓🀓🀓🀔🀔🀖🀗🀗
🀐🀐🀑🀑🀓🀓🀓🀓🀔🀔🀗🀗🀘
🀐🀐🀑🀑🀓🀓🀓🀓🀔🀔🀗🀘🀘
🀐🀐🀑🀑🀓🀓🀓🀓🀔🀖🀖🀗🀗
🀐🀐🀑🀑🀓🀓🀓🀓🀔🀗🀗🀘🀘
🀐🀐🀑🀑🀓🀓🀓🀓🀕🀕🀗🀗🀘
🀐🀐🀑🀑🀓🀓🀓🀓🀕🀕🀗🀘🀘
🀐🀐🀑🀑🀓🀓🀓🀓🀕🀗🀗🀘🀘
🀐🀐🀑🀑🀓🀓🀔🀔🀔🀔🀗🀗🀘
🀐🀐🀑🀑🀓🀓🀔🀔🀔🀔🀗🀘🀘
🀐🀐🀑🀑🀓🀔🀔🀔🀔🀗🀗🀘🀘
🀐🀐🀑🀓🀓🀓🀓🀔🀔🀕🀗🀘🀘
🀐🀐🀑🀓🀓🀓🀔🀔🀔🀔🀗🀘🀘
🀐🀐🀑🀓🀓🀓🀔🀕🀕🀕🀗🀘🀘
🀐🀐🀒🀒🀒🀒🀓🀓🀕🀕🀖🀖🀘
🀐🀐🀒🀒🀒🀒🀓🀓🀕🀕🀖🀘🀘
🀐🀐🀒🀒🀒🀒🀓🀓🀕🀖🀖🀘🀘
🀐🀐🀒🀒🀓🀓🀓🀓🀕🀕🀖🀖🀘
🀐🀐🀒🀒🀓🀓🀓🀓🀕🀕🀖🀘🀘
🀐🀐🀒🀒🀓🀓🀓🀓🀕🀖🀖🀘🀘
🀐🀑🀑🀑🀓🀓🀓🀓🀔🀔🀖🀖🀗
🀐🀑🀑🀑🀓🀓🀓🀓🀔🀔🀗🀗🀘
🀐🀑🀑🀑🀓🀓🀓🀓🀕🀕🀗🀗🀘
🀐🀑🀑🀑🀓🀓🀔🀔🀔🀔🀗🀗🀘
🀐🀑🀑🀓🀓🀓🀓🀔🀔🀕🀗🀗🀘
🀐🀑🀑🀓🀓🀓🀔🀔🀔🀔🀗🀗🀘
🀐🀑🀑🀓🀓🀓🀔🀕🀕🀕🀗🀗🀘
🀐🀒🀒🀒🀓🀓🀓🀓🀕🀕🀖🀖🀘
分類については勝手にしたものであるので、他にもっといい分類方法があるかもしれない。悪しからず。
記号の読み方は下記の通りである。
中括弧{}で括った中身はそれぞれ用いる。
例) 4202100-{04,13,4} で表されるのは下記の 3 パターン
420210004
420210013
42021004
ブラケット[]で括った中身は順番は関係ない。
例) 430[12]00[12] で表されるのは下記の 4 パターン
430120012
430120021
430210012
430210021
400-004 形
400-{140,212,221,401,410,14}-004 の 6 パターン。
220-022 形
220-{140,401,410,14}-022 の 4 パターン。
00100 形
42-00100-24, 24-00100-42 の 2 パターン。
a-0-bc-0-xy-0-z 形
a-0-bc-0-xy-0-z の形で (a, b, c) には (2, 2, 4) を (x, y, z) には (1, 2, 2) を任意の順序で入れたもの。つまり下記の 9 パターン。
2-0-24-0-12-0-2
2-0-24-0-21-0-2
2-0-24-0-22-0-1
2-0-42-0-12-0-2
2-0-42-0-21-0-2
2-0-42-0-22-0-1
4-0-22-0-12-0-2
4-0-22-0-21-0-2
4-0-22-0-22-0-1
a-0-0-z 形
a-0-{313,340,421}-0-z の形で (a, z) = (12, 21), (21, 12) としたもの。つまり下記 6 パターン。
12-0-{313,340,421}-0-21
21-0-{313,340,421}-0-12
[24]0-0[12] 形
[24]0-{040,121,202,220,310,22}-0[12] の 24 パターン。
[24]0-022 形
[24]0-{120,201,210,21}-022 の 8 パターン。
220-0[12] 形
220-{240,402,420,42}-0[12] の 8 パターン。
130-021 形
130-{240,402,420,42}-021 の 4 パターン。
4[01]-004 形
4[01]-{040,400,40,4}-004 の 8 パターン。
430 形
430[12]00[12] の 4 パターン。
420-001 形
420-{312,321,240}-001 の 3 パターン。
4202100 形
4202100-{04,13,4} の 3 パターン。
4[02] 形
4[02]201004 の 2 パターン。
103402201 形
103402201 の 1 パターン。
分類まとめ
以上をまとめると下記の表になる。
形 | パターン数 |
---|---|
400-004 | 6 |
220-022 | 4 |
00100 | 2 |
a-0-bc-0-xy-0-z | 9 |
a-0-0-z | 6 |
[24]0-0[12] | 24 |
[24]0-022 | 8 |
220-0[12] | 8 |
130-021 | 4 |
4[01]-004 | 8 |
430 | 4 |
420-001 | 3 |
4202100 | 3 |
4[02] | 2 |
103402201 | 1 |
考察
長さが6以下のものはリストに含まれていなかったので、二向聴にならないことが分かった。また 3 から始まるものがなかったのも特徴的だった。
103402201 についてはどうやってもほかのパターンに組み込むことができなかった。
🀐🀒🀒🀒🀓🀓🀓🀓🀕🀕🀖🀖🀘
まとめ
今回 92 パターンということで人力でできたが、聴牌や一向聴は人力では無理そう。プログラムを書くにしても色々こねくり回すことになるので、それはそれで難しい。
他に麻雀の計算ネタを思いついたら計算してみようと思う。
Discussion