Le défi:
Dans cette question: Nommez la main de poker que vous avez dû prendre une main de poker de cinq cartes et identifiez-la. Cette question est similaire, avec deux rebondissements:
Tout d'abord, la sortie sera en minuscules. Cela permet plus de golf, car vous n'avez pas à vous soucier de la capitalisation flush
etstraight
high card
one pair
two pair
three of a kind
straight
flush
full house
four of a kind
straight flush
royal flush
Deuxièmement, avec la popularité du Texas Hold'em et du Stud à 7 cartes, nous, ici, au code golf, devrions pouvoir marquer une main de poker à sept cartes , ai-je raison? Lorsque vous marquez une main de sept cartes, utilisez les cinq meilleures cartes pour votre main et ignorez les deux dont vous n'avez pas besoin.
Référence:
Liste des mains de poker: http://en.wikipedia.org/wiki/List_of_poker_hands
Entrée (relevée directement du fil précédent)
7 cartes provenant d'arguments stdin ou de ligne de commande. Une carte est une chaîne de deux lettres sur le formulaire RS
, où R est rang et S est costume. Les rangs sont 2
- 9
(cartes numérotées), T
(dix), J
(Jack), Q
(Reine), K
(Roi), A
(As). Les costumes sont S
, D
, H
, C
pour bêches, des diamants, des coeurs et des clubs respectivement.
Exemple de cartes
5H - five of hearts
TS - ten of spades
AD - ace of diamonds
Exemple d'entrée => sortie souhaitée
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
Remarquez que dans le deuxième exemple, il y a en fait trois paires, mais vous ne pouvez utiliser que cinq cartes, donc c'est le cas two pair
. Dans le cinquième exemple, il existe à la fois un three of a kind
et un straight
possible, mais un straight
est meilleur, donc la sortie straight
.
Notation
C'est le code-golf , donc le code le plus court gagne!
Errata
- Vous ne pouvez pas utiliser de ressources externes.
- Ace est à la fois haut et bas pour les lignes droites.
Réponses:
Rubis 353
Cela était basé sur la réponse de Chron à la question d'origine.
Cela prend l'entrée comme arguments de ligne de commande. Fondamentalement, nous répétons simplement toutes les combinaisons de taille 5 pour obtenir le type de main. Chaque type de main a été modifié afin qu'il commence par un nombre. ("royal flush" -> "0royal 4flush", "high card" -> "9high card"). Cela nous permet de trier les chaînes retournées. La première chaîne après le tri est la meilleure main possible. Nous imprimons donc cela après avoir supprimé tous les nombres de la chaîne.
la source
AS QS JS TS 9S 5H 5D
. Ça va vous coûter un personnage!Haskell
618 603 598 525 512 504 480464Cartes prises comme ligne d'entrée. Je pense que j'ai joué au golf à mort, mais je serai facilement battu par le rubis, etc. en utilisant la même astuce: si vous générez toutes les permutations, vous obtenez les tris vers l'avant que vous souhaitez rechercher en ligne droite, plus les tris inverses que vous voulez pour tester N d'un genre.
Modifié pour "coupler" en ligne et utiliser des préfixes numériques après avoir vu l'entrée de @ FDinoff, a également composé des fonctions de carte pour raser un autre caractère.
la source
"one pair","two pair"
est alors plus courtu=" pair" ... "one"++u,"two++u
C ++,
622553 caractèresquatre nouvelles lignes inutiles ajoutées ci-dessous pour plus de clarté.
Les choses ont changé dans la version golfée:
Rév. 1: toutes les variables numériques ont été remplacées par
__int64
pour une seule déclaration.Rev 1: Incrément golfé et état des
for
bouclesRev 0: modification des constantes octales en décimales.
Rev 0:
if
instructions modifiées pour les affectations avec opérateur conditionnel. Rev 1: Réarrangé plus loin en une seule expression pourt
. Cela nécessitait une nouvelle variablev
pour l'une des valeurs intermédiairesRev 0: sortie verbeuse supprimée. Ne produit que la meilleure main globale.
Rev 0: J'ai renoncé à compresser le texte de sortie (difficile en C parce que vous ne pouvez pas concaténer des chaînes en utilisant l'opérateur +.) L'écriture de "flush" une seule fois m'a sauvé 12 caractères mais m'a coûté 15, ce qui m'a rendu 3 caractères globalement moins bien. Je l'ai donc écrit 3 fois à la place.Rev 1: utiliséstd::string
au lieu dechar[]
comme suggéré par FDinoff, permettant de concaténer avec+
.Version non golfée, 714 caractères non-commentaire non blancs.
Boucle à travers les 21 mains possibles qui peuvent être faites à partir de 7 cartes et rejette 2 cartes à chaque fois. La couleur et le rang des cinq cartes choisies sont totalisés dans les variables f et p avec un chiffre octal différent pour chaque couleur / rang. Diverses opérations binaires sont effectuées pour déterminer le type de main, qui est ensuite stocké dans t (les 21 possibilités sont sorties dans la version non golfée). Enfin, la meilleure main possible est sortie.
Sortie non golfée
la source
<string>
ce qui prend en charge + pour la concaténation de chaînes. Ce qui signifie alors que vous pourriez probablement utiliser<iostream>
et utilisercout
Cependant, je ne sais pas vraiment si l'un de ces éléments conduirait à un plus petit nombre de caractères." pair flush flush straight of a kind"
= 35 caractères. Une fois que vous ajoutez des#include
économies sont minimes, vous devez alors considérer les",=+
déclarations supplémentaires et les constantes. De plus, je suis nouveau sur C ++ et je lutte avec les paramètres IDE et du compilateur (cela me force à utiliserscanf_s
etprintf_s
au lieu des anciennes versions "dangereuses" et l'aide pour le corriger tourne en rond.)cout
Pourrait aider un peu, c'est à moi de faire la liste, mais probablement pour un autre programme. Ce quicout
me tue , c'est queusing namespace std
je ne sais pas s'il y a un moyen d'éviter d'écrire tout ça.std::cout
pour vous déplacer leusing namespace std
gets_s
&puts
, plusstd::string
pour concaténer, ce qui signifie que je dois convertirchar*
en sortie. Le golf que j'ai publié fonctionne avec justestring
ou simplementiostream.
bizarrement, je dois inclure les deux pour utiliser les<<>>
opérateurs aveccin/cout
&std::string
s. Dans l'ensemble, l'utilisation des deux#include
s équivaut à 5 octets de moins, même si je peux déclarer enh
tant que astd::string
et éviter unechar
déclaration distincte . On pouvait s'y attendre, je ne peux pas trouver une liste de ce qui est ennamespace std
aide (ou une explication sur l'opérateur.)scanf
etgets
, sauf pour le golf, où les programmes sont assez dangereux de toute façon. Je pourrais raccourcir de 5 octets-s,99
si je pouvais utiliser à lagets
place degets_s
, mais je ne peux pas laisser le compilateur me le permettre. Ce qui me surprend, c'est à quel point le C / C ++ est dangereux en général! Il y a quelques semaines, cela m'aurait choqué de découvrir que cela_int64 x=1<<y
donne la mauvaise réponse pour y supérieur à 31. Mais maintenant, je suis juste un peu ennuyé. Ayant vu des choses avec des indices de tableau sortir des limites sans message d'erreur, je m'y suis habitué. Existe-t-il un moyen d'activer une meilleure vérification?perl (> = 5.14),
411403400397400Modifier : a inséré un sous qui n'a été appelé qu'une seule fois, économisant 8 caractères.
Édition 2 : a supprimé un
.""
qui avait été laissé lors d'une première tentativeÉdition 3 : au lieu d'une variable temporaire qui préserve l'original
$_
, utilisez-en une pour la rendre inutile. Gain net 3 caractères.Edit 4 : correction de l'échec de la détection de la saturation complète (2x 3-of-a-kind). coûte 3 caractères.
Pas tout à fait gagnant, mais le détecteur droit est un concept intéressant, je pense.
Version étendue:
la source
JavaScript 600
utilisation avec nodeJS:
node code.js "7H 3S 7S 7D AC QH 7C"
la source