2017-01-10 3 views
1

Per Definition ist eine Sequenz eine Kombination aus mindestens drei Karten, die in einer numerischen Reihenfolge (fortlaufende Nummern) sind. Anzüge sind nicht wichtig. Beispiel: 6 ♥ 7 ♥ 8 ♠ oder 3 ♦ 4 ♥ 5 ♦ 6 ♥Auflistung aller möglichen Kartenreihenfolgen in der Hand

In diesem Teilcode kann ich alle möglichen Kombinationen von nur drei Karten auflisten. Angenommen, die Karten in self.hand sind bereits nach Rängen sortiert.

if len(self.hand) > 2: 
    for i in range(len(self.hand)-2): 
     for j in range(i+1,len(self.hand)-1): 
      for k in range(j+1,len(self.hand)): 
       combo = Combo([self.hand[i],self.hand[j],self.hand[k]]) 
       if combo.isSequence(): 
        possibleCombos.append(combo) 

ich diesen ähnlichen Code für Folge von 4 Karten wiederholen könnte, 5 Karten, etc. aber gibt es eine kompaktere Art und Weise, dies zu tun? Ich konnte keine Möglichkeit finden, eine Anzahl von Loops zu steuern, wenn die Sequenz länger wird.

+3

von "Zahlenfolge" meinst du fortlaufende Nummern oder nur in aufsteigender Reihenfolge? – asongtoruin

Antwort

4

Per Definition ist eine Sequenz eine Kombination aus mindestens drei Karten in einer numerischen Reihenfolge.

Ich glaube, das sollte funktionieren. Ich nehme eine Reihe von 5 verschiedenen Karten (1-5) ohne Farbe an. Ich gehe auch davon aus, dass die Nummern nur in aufsteigender Reihenfolge sein müssen, worüber ich eine Klärung benötige (Danke, dass du asongtoruin fragst).

import itertools 


def all_card_sequences_of_size(cards, n): 
    return itertools.combinations(cards, n) 


if __name__ == '__main__': 
    cards = [i + 1 for i in range(5)] 
    print(list(all_card_sequences_of_size(cards, 3))) 
    print(list(all_card_sequences_of_size(cards, 4))) 

Ausgabe

[(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5), (2, 3, 4), (2, 3, 5), (2, 4, 5), (3, 4, 5)] 
[(1, 2, 3, 4), (1, 2, 3, 5), (1, 2, 4, 5), (1, 3, 4, 5), (2, 3, 4, 5)] 

Unter der Annahme, dass Sie die Sequenzen müssen nicht aufeinanderfolgend sein, hier ist eine Lösung dafür:

import itertools 

def is_sequence_consecutive(sequence): 
    return all(a == b - 1 for a, b in zip(sequence[:-1], sequence[1:])) 


def all_card_sequences_of_size(cards, n): 
    for sequence in itertools.combinations(cards, n): 
     if is_sequence_consecutive(sequence): 
      yield sequence 


if __name__ == '__main__': 
    cards = [i + 1 for i in range(5)] 
    print(list(all_card_sequences_of_size(cards, 3))) 
    print(list(all_card_sequences_of_size(cards, 4))) 

Ausgabe

[(1, 2, 3), (2, 3, 4), (3, 4, 5)] 
[(1, 2, 3, 4), (2, 3, 4, 5)] 

Um alle möglichen aufeinanderfolgenden Sequenzen für n Anzahl von Karten (n> = 3):

import itertools 


def is_sequence_consecutive(sequence): 
    return all(a == b - 1 for a, b in zip(sequence[:-1], sequence[1:])) 


def all_card_sequences_of_size(cards, n): 
    for sequence in itertools.combinations(cards, n): 
     if is_sequence_consecutive(sequence): 
      yield sequence 


def all_card_sequences(cards): 
    for i in range(3, len(cards) + 1): 
     yield from all_card_sequences_of_size(cards, i) 


if __name__ == '__main__': 
    cards = [i + 1 for i in range(5)] 
    print(list(all_card_sequences(cards))) 

Output

[(1, 2, 3), (2, 3, 4), (3, 4, 5), (1, 2, 3, 4), (2, 3, 4, 5), (1, 2, 3, 4, 5)] 
+0

was ist '1,2,3,4,5' – Navidad20

+1

Das zweite Argument ist die Anzahl der zu zeichnenden Karten. Sie können das Gleiche mit "5" tun, um diese Sequenz zu erhalten. Wenn Sie möchten, kann ich meinen Beitrag ändern, um Sequenzen aller Größen zu generieren. – Tagc

+0

Nein, du hast recht, es ist nicht meine Frage, obwohl – Navidad20

Verwandte Themen