Pyth, 73 Bytes
eo_S+*-5l@\AN}SPMJ+NZSM.:+\AT5+-4l{eMJlM.gPkJ-sM*=T+`M}2Tc4"JQKA""hscd"=Zc
Das ist ziemlich schrecklich. Karten analysieren, Werte sortieren, ... Alles braucht so viele Zeichen. Aber der Ansatz ist interessant.
Probieren Sie es online aus: Demo oder Test Suite
Erläuterung:
Ich generiere alle 52 Karten, entferne die vier Karten von der Eingabe, generiere eine Punktzahl für jede Karte (Punktzahl der Hand) und drucke die Karte mit der maximalen Punktzahl aus.
Die Partitur ist etwas merkwürdig. Wenn ich die Punktzahl zweier völlig unterschiedlicher Hände vergleiche, kann es sein, dass der falsche Gewinner ausgewählt wird. Zum Beispiel würde eine Straße 4 Asse schlagen. Aber es funktioniert, wenn die ersten 4 Karten in beiden Händen gleich sind. Und meine berechnete Punktzahl ist eigentlich kein Wert, sondern eine Liste von Werten:
- G: Zuerst gruppiere ich die 5 Karten nach Rang und nehme die Längen:
5h 5d 6c 5s Jd
->
[3, 1, 1]
- F: Dann hänge ich 4 minus der Anzahl der verschiedenen Suiten an diese Liste an.
Flush
->
3
wird angehängt, not flush
->
2/1/0
wird angehängt.
- S: Fügen Sie eine weitere Nummer hinzu.
0
Wenn es keine Gerade ist, 4
wenn es die Gerade A2345
ist oder 5
wenn es eine höhere Gerade ist.
Diese Listen mit 4 bis 7 Zahlen werden in absteigender Reihenfolge sortiert und die Liste mit dem Maximalwert wird ausgewählt.
Warum funktioniert das? Hier sehen Sie die möglichen Konfigurationen für alle Typen. Der Buchstabe neben den Zahlen gibt an, mit welcher Regel diese Nummer generiert wurde.
- Straight Flush:
[5S, 3F, 1G, 1G, 1G, 1G, 1G]
oder[4S, 3F, 1G, 1G, 1G, 1G, 1G]
- Vier von einer Sorte:
[4G, 1G, 0F, 0S]
- Volles Haus:
[3G, 2G, 1F, 0S]
oder[3G, 2G, 0F, 0S]
- Spülen:
[3F, 1G, 1G, 1G, 1G, 1G, 0S]
- Straight:
[5S, 2F, 1G, 1G, 1G, 1G, 1G]
, [5S, 1F, 1G, 1G, 1G, 1G, 1G]
, [5S, 1G, 1G, 1G, 1G, 1G, 0F]
, [4S, 2F, 1G, 1G, 1G, 1G, 1G]
, [4S, 1F, 1G, 1G, 1G, 1G, 1G]
,[4S, 1G, 1G, 1G, 1G, 1G, 0F]
- Drei einer Art:
[3G, 1G, 1G, 1F, 0S]
,[3G, 1G, 1G, 0F, 0S]
- Zwei Paare:
[2G, 2G, 2F, 1G, 0S]
, [2G, 2G, 1F, 1G, 0S]
,[2G, 2G, 1G, 0F, 0S]
- Ein Paar:
[2G, 2F, 1G, 1G, 1G, 0S]
, [2G, 1G, 1G, 1G, 1F, 0S]
,[2G, 1G, 1G, 1G, 0F, 0S]
- Hohe Karte:
[2F, 1G, 1G, 1G, 1G, 1G, 0S]
, [1F, 1G, 1G, 1G, 1G, 1G, 0S]
,[1G, 1G, 1G, 1G, 1G, 0S, 0F]
Pyth vergleicht Listen elementweise. Es ist also klar, dass ein Straight Flush immer einen Vierling schlagen wird. Die meisten typischen Pokerregeln sind bei diesen Listen offensichtlich. Einige scheinen widersprüchlich.
- Eine Straße gewinnt gegen einen Vierling oder ein Full House: Kein Problem. Wenn Sie die Chance haben, ein Vierling / Full House mit der River Card zu erhalten, können Sie nicht gleichzeitig eine Straße erreichen (da Sie bereits 2 oder 3 verschiedene Suiten auf der Hand haben).
- Ein Straight gewinnt gegen einen Flush. Wenn Sie einen Flush und eine Straße mit der River-Karte erreichen können, können Sie auch einen geraden Flush erreichen. Und der Straight Flush hat eine bessere Punktzahl als der Straight und der Flush.
- Ein Paar
[2G, 2F, 1G, 1G, 1G, 0S]
gewinnt gegen zwei Paarhände. Auch kein problem. Wenn Sie mit der River-Karte ein Paar mit zwei Karten erhalten, hatten Sie mindestens ein Paar vor dem River. Das bedeutet aber, dass Sie sich zu einem Dreier verbessern können, was besser ist. Ein Zwei-Paar wird also niemals die Antwort sein.
- Hohe Karte
[2F, 1G, 1G, 1G, 1G, 1G, 0S]
gewinnt gegen ein Paar Hände. Wenn dies die beste Punktzahl ist, die Sie erreichen können, haben Sie vor dem Fluss 3 Karten einer Suite und eine Karte einer anderen Suite. Aber dann können Sie die Karte mit einer dieser beiden Suiten und mit einem Wert auswählen, der bereits angezeigt wird, und am Ende erhalten Sie die Punktzahl [2F, 2G, ...]
, die auch besser ist.
Dies wählt also den richtigen Lösungstyp. Aber wie bekomme ich das beste Paar (aus 4 Möglichkeiten), wie wähle ich die beste Straße, ...? Weil zwei verschiedene Ein-Paar-Lösungen die gleiche Punktzahl haben können.
Das ist einfach. Pyth garantiert eine stabile Sortierung (bei maximaler Ausnutzung). Also erstelle ich einfach die Karten in der Reihenfolge 2h 2s 2c 2d 3h 3s ... Ad
. Die Karte mit dem höchsten Wert ist also automatisch das Maximum.
Implementierungsdetails
=Zc
Teilt die Eingabezeichenfolge und speichert die Kartenliste in Z
.
=T+`M}2Tc4"JQKA"
generiert die Rangliste ['2', ..., '10', 'J', 'Q', 'K', 'A']
und speichert sie in T
. -sM*T..."hscd"Z
generiert jede Rangkombination mit den Suiten und entfernt die Karten von Z
.
o...
ordnet diese verbleibenden Karten nach: lM.gPkJ
der Länge der Gruppen der Ränge, +-4l{eMJlM
hängt 4 - Länge ( Reihen ) an, +*-5l@\AN}SPMJ+NZSM.:+\AT5
hängt 0/4/5 an, abhängig von der Reihe (erzeugt jede Teilfolge der Länge 5 von "A" + T, prüft, ob die Hand Einer von ihnen (Sortierung der Hand und Sortierung aller Teilmengen erforderlich), multipliziert mit 5 (Anzahl der "A" auf der Karte), _S
sortiert die Liste in absteigender Reihenfolge.
e
wähle das Maximum und drucke.