Problem 54: Poker-Hände

Gesucht wird die Anzahl von Pokerhänden, die ein Spieler bei 1000 gegebenen Paaren gewinnt! [das englische Original]

Die Programmierung für dieses Problem war bei Weitem die aufwändigste seit Langem. Ich habe dem Problem extra ein eigenes Paket spendiert, um die einzelnen Entitäten eines Pokerspiels in separaten Klassen abzubilden:

Ausschnitt des Klassendiagramms mit dem Paket für alle Poker-Hilfsklassen

Ein echter Knackpunkt war die Vergleichbarkeit von verschiedenen Händen miteinander. Hier erschien es mir als sinnvoll, wenn man eine einzelne Hand als einen numerischen Wert repräsentieren kann. Über den Vergleich dieser Werte ist dann eine einfach Entscheidung, welche Hand höherwertig ist, möglich.

Um einen solchen Wert zu finden, habe ich mir die einzelnen Möglichkeiten zu gewinnen, von der „High Card“ bis zum „Royal Flush“ angeschaut. Da der Wert einer Karte zwischen 1 für eine ZWEI und 13 für ein AS liegt, kann man diese als Hex-Wert zwischen 0x1 und 0xD darstellen. Damit bleiben dann noch 2 Werte für höherwertige Blätter. In der nachfolgenden Tabelle habe ich die Werte für mögliche Gewinnhände dargestellt:

Tabelle mit den Werten einzelner Pokerhände in einem Spiel – jeweils mit einem Beispiel.

Auf dieser Basis ist die eigentliche Lösung dann nur noch ein Kinderspiel, da man die einzelnen Paare nur noch mit einander vergleichen muss:

@Override
public String solve() {
 
   int count = 0;
 
   for( String line : lines ) {
      String[] parts = line.split( " " );
      Hand h1 = new Hand(
         new Card( parts[ 0 ] ),
         new Card( parts[ 1 ] ),
         new Card( parts[ 2 ] ),
         new Card( parts[ 3 ] ),
         new Card( parts[ 4 ] )
      );
      Hand h2 = new Hand(
         new Card( parts[ 5 ] ),
         new Card( parts[ 6 ] ),
         new Card( parts[ 7 ] ),
         new Card( parts[ 8 ] ),
         new Card( parts[ 9 ] )
      );
 
      if( h1.beats( h2 ) ) {
         count++;
      }
   }
 
   return IO.i2s( count );
}

Den vollständigen Quellcode der Klasse für die Lösung des Problems 54 kann man sich hier anschauen!

<< Problem 53 Übersicht Problem 55 >>

Willkommen in Nico Dannebergs Netzwerk

%d Bloggern gefällt das: