Smile at Me

欢迎您来,喜欢您来

麻将向听数拾遗

参考 九条可怜 大佬的 利用查表法求麻将向听数。过程中有一些数学证明省略了,在这里记录一下加深理解。说句题外话,大佬在知乎唯二的两篇文章,最新的一篇 大数快速取模魔法,和我当时做的关于伽罗华域(Galois Field, GF)的毕设简直不要太贴合。哎,我真是学艺不精。

原文主要是针对向听数计算和序列生成进行讲解的,本文主题亦如此。

0x01 向听数计算

对于大众麻将,包括日本麻将和国标麻将,不考虑特殊牌型(七对、十三幺、不靠等)基本的胡牌条件为:m 个面子加上 1 个对子,即可胡牌。为行文方便,将胡牌公式简单记为

3m+2

其中 3 代表面子,2 代表对子。结合麻将规则,容易知道对于能够胡牌的手牌总数 N,有

N \in \{2, 5, 8, 11, 14\}

牌效率理论定义了向听数(Syanten),指一副牌距离听牌状态最少还差几次打摸动作。0 向听 = 听牌,-1 向听 = 胡牌。若非特殊说明,下文所指的向听数皆为一般牌型的向听数。

对两张不同的牌 x, y 定义距离计算函数 D(x,y)

D(x,y) = \begin{cases} 0,  (x, y 为同种牌)\\ 1,  (x, y 为同种数牌,且数字差 = 1) \\ 2,  (x, y 为同种数牌,且数字差 = 2) \\ \infty,  (otherwise) \\ \end{cases}

根据 3m + 2 ,将牌组序列 tiles 分为两个部分:要凑成若干个面子的部分 tiles_{m},\ \sum tiles_{m}\ mod\ 3=0 和要凑成一对对子的部分 tiles_{p},\ \sum tiles_{p}=2。定义向听数计算函数 S(tiles)

Read

玩耍

跨年的那一刻,大家都嗨疯了。认识的不认识的人都挤在一起,随着音乐节拍在那里唱着跳着。嗨到深处了,服务员踩在吧台上,一瓶威士忌直接往下倒,下面的人张大嘴巴接着,周围发出一阵尖叫。我被人群挤了出来,突然感到一阵头晕,低头一看手表,心率 150 。我受不了了,赶忙穿过人群到酒吧外面透气。这时候手机振动了,张老师通过了我的好友请求。

From: 大垣(おおがき)
2022-01-01, 凌晨 00:07
我通过了你的验证请求,现在我们可以开始聊天了
新年快乐~
新年快乐!
刚才不知道你走了,出来找你找不到,才想着说加你问一下
哦哦,没事啊
我觉得我走了你们自在点
没有,大家都问你去哪了
我自己能照顾好自己
不想扫兴
你们玩开心点吧,这只是个小插曲
别放心上

我有点迷茫,不知道是我在追张老师,还是检测在追张老师。她没等自己的那一杯酒上来,就拎着包径直出去了。我赶紧示意检测跟出去,检测才后知后觉地起身。

后来听箱子说,当时她和 Yuri 在酒吧走道拍照,听到张老师和检测抱怨。张老师说她已经 30 岁的人了,受不了这种场合,觉得尴尬。而检测愣愣地站在旁边,一句话没有说。

失控

平安夜的晚上,阿婷和同事们烧烤去了。我打开自嗨锅准备自嗨一下。自嗨锅是阿敏送我的,原本是她的混蛋店长送给她的,但她不喜欢吃。她吩咐我吃的时候给拍张照,好让她转发给店长交差。自嗨锅的说明书上告诉我一定要浇冷水,但我没注意,我给浇了热水,刚浇下去那个发热包就像个河豚一样突然涨得老大,还噗呲噗呲地冒着热气,一副快要炸开的样子,差点没把我吓死。

Read