非常繁琐的题,先判断十三幺和七对子。
十三幺:要求的牌面已经有十三张,因此将牌只能是这十三种之一,所以当且仅当手牌转化为集合后与这十三种牌组成的集合一致时才能作十三幺。
七对子:当且仅当每张手牌的出现次数都是2时才能作七对子。
接下来递归判断垃圾胡:
把手牌排序,每次考察最小的牌:
若当前牌数不能被3整除,说明还未取过将牌,若最小的牌可以形成将牌,就把这一对牌移除并考察剩余的牌。
否则若能形成一坎,就将这一坎移除再考察剩余的牌。
其中刻子较易识别和处理。要识别顺子,可以先生成以第一张牌为键值的字典辅助判断。
最后,若所有牌都能在上述过程中移除,说明可以胡牌,否则不能胡牌。
最终代码行有五行。
代码长度:523字节 vs. 全站第一:198字节。
import sys
d={k[i]:k[i:i+3]for i in range(7)for k in["🀇🀈🀉🀊🀋🀌🀍🀎🀏","🀙🀚🀛🀜🀝🀞🀟🀠🀡","🀐🀑🀒🀓🀔🀕🀖🀗🀘"]}
x=lambda s:(len(s)%3and s[0]==s[1]and x(s[2:]))or(s[0]==s[1]==s[2]and x(s[3:]))or(s[0]in d and {*d[s[0]]}<={*s}and x([j for i,j in enumerate(s)if i>0and(j not in d[s[0]]or j==s[i-1])]))if s else 1
for a in sys.argv[1:]:(all([a.count(i)==2 for i in a])or {*"🀀🀁🀂🀃🀄🀅🀆🀇🀏🀐🀘🀙🀡"}=={*a}or x(sorted(list(a))))and print(a)
|