麻雀の手牌の文字列表現

今回のお題は麻雀の和了点を求めるプログラムの予定だったのだが、予定を変更して手牌の文字列表現について。

麻雀の牌姿を示すときに、牌画を使うのも面倒なので文字で表す場合がある、例えば以下の牌姿の場合、
一萬二萬三萬四筒五筒六筒七索八索九索東東白白

  • 一二三④⑤⑥789東東白白

とするような表現方法。

電脳麻将 では以下の4種類の方法で手牌の文字列表現を定義している。

単独の牌

一萬'm1'二筒'p2'三索's3'東'z1'白'z5' といった具合。
赤五筒'p0' とした。

さらに加えて、自摸切りの場合は次に '_' をつけ、立直宣言牌の場合はさらに末尾に '*' を付加する。四萬自摸切り立直の場合は、'm4_*' となる。

手牌(兵牌)

一萬二萬三萬四筒五筒六筒七索八索九索東東白白 赤五萬
の場合、'm123p456s789z1155m0'。最後の1牌が自摸牌を表す。

面子

横三萬二萬四萬'm23-4'五筒横赤五筒五筒'p550='裏發發裏'z6666'

'-' は上家からの鳴き、'+' は下家からの鳴き、'=' は対面からの鳴きを表す記号。

九索九索横九索 に加槓した場合は 's999+9' とする。

手牌全体

兵牌と副露面子を ',' で連結した形とする。

赤五萬五萬五萬中中發横發發裏白白裏横八萬七萬九萬

'm055z77,m78-9,z5555,z666=' となる*1

*1:副露順に注意