Herausforderung:
Bestimmen Sie bei zwei Fünf-Karten-Händen anhand der Standardrangfolge der Pokerblätter , welche gewinnt .
Eingang:
Zehn durch Leerzeichen von stdin oder als Befehlszeilenargumente getrennte Karten, je nachdem, was Sie bevorzugen. Die ersten fünf Karten sind die Hand von Spieler 1, während die letzten fünf die Hand von Spieler 2 sind. Jede Karte besteht aus zwei Buchstaben der Form RS, wobei R Rang und S Farbe ist. Die Ränge reichen von 2-9, T für zehn und J, Q, K und A für Jack, Queen, King und Ace. Die Farben sind H, D, C, S für Herzen, Diamanten, Keulen und Pik. Sie müssen die Nummer des Spielers ausgeben, der gewinnt: '1' oder '2'.
Beispiele für Karten:
AS - the Ace of Spades
QD - the Queen of Diamonds
2C - the Two of Clubs
TH - the Ten of Hearts
Input to Output Beispiele:
5H 5C 6S 7S KD 2C 3S 8S 8D TD -> 2
Erklärung: Spieler 1 hat ein Paar Fünfer, während Spieler 2 ein Paar Acht hat.
5D 8C 9S JS AC 2C 5C 7D 8S QH -> 1
Erläuterung: Keiner der Spieler hat etwas Besonderes, aber die hohe Karte von Spieler 1 ist ein Ass, während die hohe Karte von Spieler 2 eine Dame ist.
2D 9C AS AH AC 3D 6D 7D TD QD -> 2
Erklärung: Spieler 1 hat drei Asse, Spieler 2 hat einen Flush of Diamonds.
4D 6S 9H QH QC 3D 6D 7H QD QS -> 1
Erläuterung: Beide Spieler haben ein Paar Damen, aber die zweithöchste Karte von Spieler 1 ist eine Neun, während die von Spieler 2 eine Sieben ist.
Regeln und Erläuterungen:
- Weitere Informationen zum Vergleichen von Händen finden Sie in der Standardrangliste der Pokerblätter.
- Sie können davon ausgehen, dass es keine wiederholten Karten in jedem Paar Hände gibt.
- Sie können davon ausgehen, dass es jeweils einen konkreten Gewinner gibt.
- Die Farbe berücksichtigt nicht die Rangfolge einer Hand. Zum Beispiel sind zwei Royal Flushes unterschiedlicher Farben gleich (daher ist jede Eingabe, bei der beide Spieler einen Royal Flush haben, nach der vorstehenden Regel ungültig).
- Da dies Codegolf ist, gewinnt die kürzeste Antwort.
Anmerkungen:
- Bezogen auf diese und diese Frage .
- Basierend auf Projekt Euler Problem 54
Antworten:
Haskell -
352339 ZeichenLäuft:
Ungolf'd und kommentierte, so dass Sie das techinque sehen können:
quelle
Python -
774722707698685 ZeichenIch habe mich entschieden, für jede Hand eine Zeichenfolge zu generieren, die sie repräsentiert, beginnend mit einem Zeichen für den Handtyp, gefolgt von Zeichen, die die jeweilige Variation des Typs beschreiben (z. B. welche Karte hatten Sie gerade 4?), Gefolgt von die Werte der verbleibenden Karten im Falle eines Gleichstands (wenn beide Spieler dasselbe Doppelpaar haben, muss die 5. Karte entscheiden, wer gewinnt). Ich habe es ziemlich ausgiebig getestet, aber ich spiele eigentlich nicht Poker, also hoffe ich, dass ich es richtig gemacht habe. Außerdem weiß ich, dass es noch nicht voll besetzt ist. Ich kann wahrscheinlich ein paar Dutzend Zeichen später abschneiden.
quelle
_=lambda c:chr(97+c)
. Außerdem haben Sie nach:
s und=
s unnötige Leerzeichen . Verwenden Sie;
abschließend anstelle von neuen Zeilen Anweisungen, um das für Einrückungen verwendete Leerzeichen zu reduzieren.JavaScript -
526508Verwendung:
ungolfed:
Quelle
quelle
Perl,
801733 ZeichenIch glaube, das ist eine ziemlich direkte Implementierung. Grundsätzlich sortieren wir für jede Hand die Anzüge und die Gesichter getrennt. Dann machen wir eine weitere Kopie der Gesichter mit niedrigen Assen, damit wir nach Geraden mit niedrigen Assen suchen können. Dann stellen wir fest, ob wir einen Flush oder eine Straße haben und wie hoch die Karte ist. Dann suchen wir nach Übereinstimmungen in der Reihenfolge des Ergebnisses (zuerst suchen wir nach Straight Flushes, dann nach Vierergruppen usw.). Die tatsächliche Punktzahl ist nur die Verkettung der Art der Hand, gefolgt von den Nennwerten der Karten in der Reihenfolge, in der sie wichtig sind (das ist _s () in der ungolfed-Version, u () in der golfed-Version). Hier ist es:
Und hier ist das Äquivalent für weniger Golfspieler:
quelle
AH 2C 3S 4S 5D 6C 7S 7C 7D TD
produziert ein Ergebnis von2
, aber ich denke, ein Straight schlägt drei