首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >纸牌游戏中的拆分和附加列表

纸牌游戏中的拆分和附加列表
EN

Stack Overflow用户
提问于 2012-05-24 02:27:11
回答 2查看 211关注 0票数 2

我正试图从预定的直道牌中生成一个潜在的牌“牌”列表(在这个游戏中,直线被定义为3+牌-例如[3,4,5])。困难之处在于找到一种方法来获取一个已识别的直道的列表(其中可能包括多个未连接的直道- ['2D','3D','4D','5D','6D','8D','9D','10D']),并将它们中包含的附加到播放列表中(对于给定的一只手,理想的输出是[['2D','3D','4D'],['3D','4D','5D'],['4D','5D','6D'],['2D','3D','4D','5D'],['3D','4D','5D','6D'],['8D','9D','10D']])。

以下是目前正在进行的尝试;

代码语言:javascript
复制
seq = ['1D','2D','3D','4D', '6D', '7D','8D', '10D', '11D', '12D']
plays = []
for card in seq:
    ind = seq.index(card)+1
    try:
        if int(seq[ind][0:len(seq[ind])-1]) - int(card[0:len(card)-1]) == 2:
            for num in xrange(len(seq[0:ind])):
                if len(seq[0:(ind-num)]) > 3:
                    plays.append(seq[0:(ind-num)])
                    plays.append(seq[num+1:ind])
                elif len(seq[0:(ind-num)]) == 3:
                    plays.append(seq[0:(ind-num)])
            print plays #debug
except IndexError:
    print 'error'
    #append from the last appended chunk up until last element?
    #arises from final element

['1D','2D','3D','4D','2D','3D','4D','1D','2D','3D']

[“1D”、“2D”、“3D”、“4D”、“2D”、“3D”、“4D”、“1D”、“2D”、“3D”、'1D‘、'2D’、'3D‘、'4D’、'6D‘、'7D’、'8D''2D‘、'3D’、'4D‘、'6D’、'7D‘、’7D‘、'8D''1D','2D','3D','4D','6D','7D''3D','4D','6D','7D','7D',‘8D’‘'1D','2D','2D','3D','4D','6D', '4D','6D',’8D‘*['1D',’2D‘,'3D','4D'],'6D','7D','8D','1D','2D','3D']

错误

输出以粗体表示不需要的元素(重复或单独直道的连接)。谢谢你的投入!

编辑1:增加第10-12行

编辑2:@Steve Tjoa提供的新增解决方案

(假定卡片是一系列ints)卡片= 1,2,3,4,6,7,8,10,11,12

代码语言:javascript
复制
def f(cards):
    for i in range(len(cards)):
        for j in range(i+3, len(cards)+1):
            if cards[i:j] == range(cards[i], cards[i]+j-i):
                plays.append(cards[i:j])
            print plays
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-24 02:45:22

这个有用吗?

代码语言:javascript
复制
In [34]: def f(cards):
   ....:     return [cards[i:j]
   ....:             for i in range(len(cards))
   ....:             for j in range(i+3, len(cards)+1)
   ....:             if cards[i:j] == range(cards[i], cards[i]+j-i)]
   ....: 

In [35]: f([1, 2, 3, 4, 6, 7, 8, 10, 11, 12])
Out[35]: [[1, 2, 3], [1, 2, 3, 4], [2, 3, 4], [6, 7, 8], [10, 11, 12]]

In [36]: f([2, 3, 4, 5, 6, 8, 9, 10])
Out[36]: 
[[2, 3, 4],
 [2, 3, 4, 5],
 [2, 3, 4, 5, 6],
 [3, 4, 5],
 [3, 4, 5, 6],
 [4, 5, 6],
 [8, 9, 10]]

理由:cards[i]是直牌的第一张牌,cards[j-1]是最后一张牌。range返回连续整数。j-i是直线的长度。

票数 2
EN

Stack Overflow用户

发布于 2012-05-24 03:51:39

这是另一种方法,如果你想要同时显示排名和套房的戏剧列表。

代码语言:javascript
复制
plays = []
hand = ['AD','2D','3D','4D', '6D', '7D','8D', 'TD', 'JD', 'QD']
ranks = sorted([('-A23456789TJQK'.index(r), r+s) for r, s in hand], reverse = True)
for j in range(3, len(hand)):
    for i,r in enumerate(ranks):
        rnk = [x[0] for x in ranks[i:i+j]]
        if (max(rnk)-min(rnk) == j-1) and len(set(rnk)) == j:
            plays.append([x[1] for x in ranks[i:i+j]])

print plays
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10730350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档