Die Herausforderung:
In dieser Frage: Nennen Sie die Pokerhand , für die Sie eine Fünf-Karten-Pokerhand nehmen mussten, und identifizieren Sie sie. Diese Frage ist ähnlich, mit zwei Wendungen:
Erstens wird die Ausgabe in Kleinbuchstaben erfolgen. Dies ermöglicht mehr Golf, da Sie sich nicht um die Großschreibung von flush
und kümmern müssenstraight
high card
one pair
two pair
three of a kind
straight
flush
full house
four of a kind
straight flush
royal flush
Zweitens, mit der Popularität von Texas Hold'em und 7 Card Stud sollten wir hier bei Code Golf in der Lage sein, eine 7-Karten- Pokerhand zu erzielen, stimmt's? Wenn Sie eine Hand mit sieben Karten erzielen, verwenden Sie die fünf besten Karten für Ihre Hand und ignorieren Sie die beiden, die Sie nicht benötigen.
Referenz:
Liste der Pokerhände: http://en.wikipedia.org/wiki/List_of_poker_hands
Eingabe (direkt vom vorherigen Thread abgehoben)
7 Karten aus Standard- oder Befehlszeilenargumenten. Eine Karte ist eine aus zwei Buchstaben bestehende Zeichenfolge auf dem Formular RS
, wobei R der Rang und S die Farbe ist. Die Ränge sind 2
- 9
(Zahlenkarten), T
(zehn), J
(Bube), Q
(Königin), K
(König), A
(Ass). Die Anzüge sind S
, D
, H
, C
für Pik, Karo, Herz und Clubs sind.
Beispiel für Karten
5H - five of hearts
TS - ten of spades
AD - ace of diamonds
Beispiel für Eingabe => gewünschte Ausgabe
3H 5D JS 3C 7C AH QS => one pair
JH 4C 2C 9S 4H JD 2H => two pair
7H 3S 7S 7D AC QH 7C => four of a kind
8C 3H 8S 8H 3S 2C 5D => full house
AS KC KD KH QH TS JC => straight
Beachten Sie, dass es im zweiten Beispiel tatsächlich drei Paare gibt, Sie jedoch nur fünf Karten verwenden können two pair
. Im fünften Beispiel gibt es sowohl a three of a kind
als auch a straight
möglich, aber a straight
ist besser, also Ausgabe straight
.
Wertung
Dies ist Code-Golf , also gewinnt der kürzeste Code!
Errata
- Sie dürfen keine externen Ressourcen verwenden.
- Ace ist sowohl hoch als auch niedrig für Geraden.
Antworten:
Ruby 353
Dies beruhte auf Chron 'Antwort aus der ursprünglichen Frage.
Dies nimmt Eingaben als Befehlszeilenargumente entgegen. Grundsätzlich durchlaufen wir einfach alle Kombinationen der Größe 5, um herauszufinden, um welche Art von Hand es sich handelt. Jeder Handtyp wurde so geändert, dass er mit einer Zahl beginnt. ("Royal Flush" -> "0royal 4flush", "High Card" -> "9high Card"). Auf diese Weise können wir zurückgegebene Zeichenfolgen sortieren. Die erste Zeichenfolge nach dem Sortieren ist die bestmögliche Hand. Also drucken wir das aus, nachdem wir alle Zahlen aus der Zeichenfolge entfernt haben.
quelle
AS QS JS TS 9S 5H 5D
. Das kostet dich einen Charakter!Haskell
618 603 598 525 512 504 480464Karten als Eingabezeile genommen. Ich glaube, ich habe dies zu Tode gespielt, werde aber mit demselben Trick leicht von Rubin usw. geschlagen: Wenn Sie alle Permutationen erzeugen, erhalten Sie die Vorwärtssorten, nach denen Sie suchen möchten, sowie die Rückwärtssorten, die Sie zum Testen von N benötigen von einer Art.
Bearbeitet, um "Paar" zu inlineieren und Nummernpräfixe zu verwenden, nachdem @ FDinoffs Eintrag angezeigt wurde. Außerdem wurden Kartenfunktionen erstellt, um ein weiteres Zeichen zu rasieren.
quelle
"one pair","two pair"
ist kürzer alsu=" pair" ... "one"++u,"two++u
C ++,
622553 ZeichenZur Verdeutlichung wurden unten vier unnötige Zeilenumbrüche hinzugefügt.
In der Golfversion haben sich die Dinge geändert:
Rev 1: Alle numerischen Variablen wurden
__int64
für eine einzelne Deklaration in geändert .Rev 1: Golf Inkrement und Zustand der
for
LoopsRev 0: Oktalkonstanten in Dezimal geändert.
Rev 0: Geänderte
if
Anweisungen für Zuweisungen mit bedingtem Operator. Rev 1: Weiter angeordnet in einen einzigen Ausdruck fürt
. Dies erforderte eine neue Variablev
für einen der ZwischenwerteRev 0: Ausführliche Ausgabe gelöscht. Gibt nur die beste Hand aus.
Rev. 0: Ich habe auf das Komprimieren des Ausgabetextes verzichtet (schwierig in C, da Sie Zeichenfolgen mit dem Operator + nicht verketten können). Das Schreiben von "Flush" nur einmal hat mir 12 Zeichen erspart, mich aber 15 gekostet, was mich insgesamt 3 Zeichen schlechter macht. Also habe ich es stattdessen nur dreimal geschrieben.Rev. 1: Wirdstd::string
anstelle derchar[]
von FDinoff vorgeschlagenen verwendet, um eine Verkettung mit zu ermöglichen+
.Ungolfed Version, 714 nicht kommentierte Nicht-Leerzeichen.
Durchläuft alle 21 möglichen Hände, die aus 7 Karten hergestellt werden können, und lehnt jedes Mal 2 Karten ab. Die Farbe und der Rang der fünf ausgewählten Karten werden in den Variablen f und p mit einer anderen Oktalzahl für jede Farbe / jeden Rang summiert. Verschiedene Bitoperationen werden ausgeführt, um den Hand-Typ zu bestimmen, der dann in t gespeichert wird (alle 21 Möglichkeiten werden in der ungolfed-Version ausgegeben.) Schließlich wird die bestmögliche Hand ausgegeben.
Ungolfed Ausgabe
quelle
<string>
was + für die Verkettung von Zeichenfolgen unterstützt. Was dann bedeutet, dass Sie wahrscheinlich verwenden<iostream>
und verwenden könnten.cout
Ich weiß jedoch nicht, ob eines davon zu einer geringeren Anzahl von Zeichen führen würde." pair flush flush straight of a kind"
= 35 Zeichen. Wenn Sie#include
nur minimale Einsparungen erzielen, müssen Sie zusätzliche Einsparungen",=+
und Deklarationen von Konstanten berücksichtigen . Außerdem bin ich neu in C ++ und habe Probleme mit IDE- und Compiler-Einstellungen (es zwingt mich, diese zu verwenden,scanf_s
undprintf_s
anstelle der alten "unsicheren" Versionen und der Hilfe zur Behebung geht es in Kreisen um.)cout
Könnte ein wenig helfen, es liegt an mir Liste auflisten, aber wahrscheinlich für ein anderes Programm. Wascout
mich umbringt , ist, dassusing namespace std
ich nicht weiß, ob es einen Weg gibt, das alles nicht zu schreiben.std::cout
, um dieusing namespace std
gets_s
&puts
, plusstd::string
zum Verketten, was bedeutet, dass ichchar*
in Ausgabe konvertieren muss . Der Golf, den ich gepostet habe, funktioniert nurstring
oder nuriostream.
bizarr. Ich muss beide einbeziehen, um<<>>
Operatoren mitcin/cout
&std::string
s zu verwenden. Insgesamt#include
funktioniert die Verwendung beider s um 5 Bytes schlechter, obwohl ichh
als deklarierenstd::string
und eine separatechar
Deklaration vermeiden kann . Vorhersehbar kann ich keine Liste dernamespace std
Hilfeleistungen finden (oder eine Erklärung zum Betreiber).scanf
undgets
außer beim Golfen, wo Programme sowieso ziemlich unsicher sind. Ich könnte um 5 Bytes verkürzen,-s,99
wenn ichgets
stattdessen verwenden könntegets_s
, aber ich kann den Compiler nicht dazu bringen, mich zuzulassen. Was mich überrascht ist, wie unsicher C / C ++ im Allgemeinen ist! Vor ein paar Wochen hätte es mich schockiert zu finden, dass_int64 x=1<<y
die falsche Antwort für y größer als 31 ist. Aber jetzt bin ich nur leicht verärgert. Nachdem ich gesehen habe, dass Array-Indizes ohne Fehlermeldung außerhalb der Grenzen liegen, habe ich mich daran gewöhnt. Gibt es eine Möglichkeit, die Überprüfung besser einzuschalten?Perl (> = 5,14),
411403400397400Bearbeiten : Inline ein Sub, das nur einmal aufgerufen wurde und 8 Zeichen spart.
Bearbeiten 2 : Entfernte ein Element, das
.""
bei einem frühen Versuch übrig geblieben war.Bearbeiten 3 :
$_
Verwenden Sie anstelle einer temporären Variablen, die das Original beibehält , eine, um es unnötig zu machen. Nettogewinn 3 Zeichen.Bearbeiten 4 : Fehler beim Erkennen eines überfüllten Hauses behoben (2x 3-of-a-kind). kostet 3 Zeichen.
Nicht ganz ein Gewinner, aber der gerade Detektor ist ein interessantes Konzept, denke ich.
Erweiterte Version:
quelle
JavaScript 600
Verwendung mit nodeJS:
node code.js "7H 3S 7S 7D AC QH 7C"
quelle