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']]

以下は現在行われている試みです。

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'、' 8D '][' 1D'、' 2D'、' 3D'、' 4D'、' 6D'、' 7D'][' 3D'、' 4D'、' 6D'、' 7D'、' 8D']['1D'、 '2D'、 '3D'、 '4D'、 '6D']、 ['4D'、 '6D'、 '7D'、 '8D'] **['1D'、 '2D'、 '3D'、 '4D ']、['6D'、 '7D'、 '8D' ]、['1D'、 '2D'、 '3D'] ]]

エラー

太字の出力は、不要な要素(重複または個別のストレートの接続詞)を示します。入力ありがとうございます!

編集1:10〜12行目を追加

編集2:@SteveTjoaが提供するソリューションを追加

(カードが一連のintであるとすると)cards = [1、2、3、4、6、7、8、10、11、12]

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
4

2 に答える 2

2

これは役に立ちますか?

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ストレートの長さです。

于 2012-05-24T02:45:22.637 に答える
0

ランクとスイートの両方を表示したい場合は、プレイのリストを取得する別の方法を次に示します。

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
于 2012-05-24T03:51:39.900 に答える