【位元組跳動實習面試 2019-01-07】
給定長度為14的整型陣列,判斷是否胡牌2 + 3*4 dd + (abc or aaa) * 4
範圍 1~9之間代表數字1~9
形如 111 222 333 456 77 返回true
形如 111 223 345 67 999 返回true
形如 111 222 333 457 99 返回false
把規則拆分開,分開討論,不可能乙個式子包括所有情況的
from collections import counter
defis_agari
(tehai)
->
bool
:def
is_agari_impl
(tehai_cnt: counter, rest_tiles:
int)
->
bool
:""" args:tehai_cnt: 各種牌的枚數資訊rest_tiles: 剩餘手牌張數 """
if rest_tiles ==0:
return
true
min_tile =
min(
filter
(lambda x: tehai_cnt[x]
, tehai_cnt.keys())
)# 拆刻子(aaa)
if tehai_cnt[min_tile]
>=3:
tehai_cnt[min_tile]-=3
if is_agari_impl(tehai_cnt, rest_tiles -3)
:return
true
tehai_cnt[min_tile]+=3
# 拆雀頭(對子,即dd)
if rest_tiles %
3and tehai_cnt[min_tile]
>=2:
tehai_cnt[min_tile]-=2
if is_agari_impl(tehai_cnt, rest_tiles -2)
:return
true
tehai_cnt[min_tile]+=2
# 拆順子(abc)
if(min_tile <
27and min_tile %
9<
7and tehai_cnt[min_tile +1]
and tehai_cnt[min_tile +2]
):tehai_cnt[min_tile]-=1
tehai_cnt[min_tile +1]
-=1tehai_cnt[min_tile +2]
-=1if is_agari_impl(tehai_cnt, rest_tiles -3)
:return
true
tehai_cnt[min_tile +2]
+=1tehai_cnt[min_tile +1]
+=1tehai_cnt[min_tile]+=1
return
false
return is_agari_impl(counter(tehai)
,len
(tehai))if
len(tehai)%3
==2else
false
if __name__ ==
'__main__'
:# tehai = [0,0,0,1,2,3,4,5,6,7,8,8,8,8]
tehai =[1
,1,1
,2,3
,4,2
,3,4
,5,6
,8,9
,9]
麻將胡牌判決
胡牌有以下幾種情況 1 乙個對子 4組 3個相同的牌或者順子。只有m s p是可以構成順子的。東西南北這樣的牌沒有順子。2 7個不同的對子。3 1m,9m,1p,9p,1s,9s,1c,2c,3c,4c,5c,6c,7c.這13種牌每種都有,而且僅有這13種牌。肯定是有一種2張。其他的1張。首先是列...
麻將胡牌判決
就是給了13張牌。問增加哪些牌可以胡牌。胡牌有以下幾種情況 1 乙個對子 4組 3個相同的牌或者順子。只有m s p是可以構成順子的。東西南北這樣的牌沒有順子。2 7個不同的對子。3 1m,9m,1p,9p,1s,9s,1c,2c,3c,4c,5c,6c,7c.這13種牌每種都有,而且僅有這13種牌...
麻將胡牌演算法
majiang algorithm是帶多張鬼牌的通用胡牌演算法,採用查表方式,簡單高效。在生成表的階段,時間是不值錢的,所以生成方法我們可以任意窮舉。首先分為普通 風 箭三張表。窮舉出所有的key,比如普通表,就是000000000 444420000,因為每一種牌最大4張,且總和不超過14張牌。對...