2020/11/09 追記
以下の場合に、失敗する。。
11112222456789
「111」「222」「456」「789」「12」
1,2どちらを切っても「3」待ちになる。
(0シャンテン)
22223333789東東東
「222」「333」「789」「東東東」「23」
2,3,東のどれを切っても「1」,「4」待ちになる。
(0シャンテン)
これは特別ルール(2)で正しいシャンテン数とならない。 (11/10再 <- 嘘。。正しいシャンテン数となる。少し冷静になろう。。)
シャンテン数を求めるプログラムを作成する際に、つまづいたところが合ったので備忘録として。
シャンテン数は8点ルールというものをベースに求めました。
(参考)
「Mリーグ成績速報(非公式)」さま
手牌の向聴(シャンテン)数の数え方
https://note.com/mleague_results/n/nfe3e0e8774db
メンツを2点、対子、ターツを1点として抜き出し、(8ー合計の点数)=シャンテン数とするものです。(0がテンパイ、-1が上がりとなる)
こちらのルールだけだと簡単なのですが、以下の特別な対応が必要になります。
◆8点ルールの特別ルール
(1)抜き出せるブロックは最大5つまで。抜き出す優先順位は面子→対子→ターツ の順番
(2)5ブロックちょうどを抜き出して雀頭がない場合は1点減点
面倒なのが、(2)のケースです。
以下の手牌とツモ牌があった場合について考えます。
【東東東東111145678】 ツモ:9
(メンツに分解したもの「東東東」「111」「456」「789」「東」「1」)
8点ルールにしたがって考えると、メンツ4個と孤立牌2個で8点となり、0シャンテン=テンパイとなります。
しかしながら、「東」「1」どちらを切っても待ち牌になる「1」「東」は自身で4枚使い切っているため、テンパイとなりません。この場合は1シャンテンが正解です。
(※4枚使い切っている牌での待ちをテンパイ形とみなすルールもあるらしいです)
ちなみにツモ牌がない場合
【東東東東111145678】
(メンツとターツに分解したもの「東東東」「111」「456」「78」「東」「1」)
この場合も8点ルールにしたがって考えると、メンツ3個とターツ1個で7点となり1シャンテンとなりますが、実際には2シャンテンです。
この5枚目の待ち問題に対応するために、次の特別ルールを加えました。
(3)対子(雀頭)がないが(2)が適用されない場合、メンツ、対子、ターツを抜き出したあとの孤立牌の数を数える(r枚)。この孤立牌が元々4枚持っていた牌と一致する数を数える(k枚)。(r=k)のとき1点減点
(2)が元々、雀頭不足に対するものですが、さらに拡張した感じです。