Bridge Hand Scoring

13

L'une des choses qui rend Contract Bridge très intéressant est son méta-jeu "artificiel" très compliqué. Ce système de notation des mains n'en est qu'une petite partie.

Bridge est un jeu de cartes astucieux. Chaque joueur reçoit une main de 13 cartes, et le jeu commence avec l' enchère . Les enchères déterminent la façon dont le reste du jeu se déroule, et c'est donc une partie cruciale de celui-ci. Afin de vous assurer que vous et votre partenaire n'enchérissez pas trop (ou trop bas), ce système de notation artificielle a été développé pour vous dire à quel point votre main est bonne.

Notation

Voici un exemple de main:

S:KQT5
H:J72
D:965
C:AK8

Les S, H, D, C représentent les costumes (pique, coeurs, diamants et massues) et le reste sont les cartes de ces costumes. Cette main a donc une reine de pique (Q), un roi de pique (K), dix de pique (T), cinq de pique, un valet de cœur, sept de cœur, etc.

Le système de notation fonctionne comme suit:

  • Vous obtenez 4 points pour chaque as (A) que vous avez, 3 points pour chaque roi (K), 2 points pour chaque reine (Q) et 1 point pour chaque valet (J). Aucune autre carte ne donne de points.
  • Chaque carte après la quatrième d'une couleur vous donne 1 point. Donc, si vous avez six cœurs, vous obtiendrez 2 points.
  • Un costume où vous n'avez que 2 cartes vous donne 1 point (c'est un doubleton). Une combinaison où vous n'avez qu'une seule carte vous donne 2 points (c'est un singleton). Si vous n'avez pas de cartes dans une certaine couleur, vous obtenez 3 points (c'est un vide). (Habituellement, ceux-ci ne sont comptés qu'une fois que vous avez convenu d'un costume avec votre partenaire, mais je les inclue pour rendre le défi plus intéressant.)

Donc, la main ci-dessus a 13 points.

Défi

Étant donné une main de bridge dans le format ci-dessus, calculez le nombre de points de la main. Les combinaisons seront toujours répertoriées dans l'ordre pique, cœur, diamant et massues, et les cartes seront toujours triées dans l'ordre A, K, Q, J, T, 9-2.

Exemples d'entrées et de sorties

S:KQT5
H:J72
D:965
C:AK8
       \-> 13

S:AKQT6
H:54
D:J83
C:732
       \-> 12

S:
H:KQT8754
D:A86
C:432
       \-> 15

S:9876
H:843
D:652
C:432
       \-> 0

S:AKQT5
H:AQJ6
D:Q3
C:AK
       \-> 28

C'est le , donc le code le plus court en octets gagne.

un spaghetto
la source

Réponses:

4

Gelée, 27 25 21 octets

Merci @Dennis pour -3 octets!

L_5.AḞW+“JQKA”i$€Sµ€S

Cela prend l'entrée comme une liste de lignes. Pour prendre l'entrée en tant que chaîne multiligne, précaténer a ṣ⁷µ.

Faire un tableau des points de fréquence:

Cards:    0  1  2  3  4  5  6 ... 4+k
Points:   3  2  1  0  0  1  2 ... k

nous pouvons voir qu'ils sont égaux à abs(c-3.5)-.5, où c est le nombre de cartes. Comme chaque ligne contient deux caractères supplémentaires et que le nombre de points est toujours un entier, c'est floor(abs(l-5.5))là que l est la longueur de la ligne.

Notez que les indices de Jelly sont basés sur 1, ainsi que le comportement des fonctions vectorisées sur des dimensions incompatibles: les éléments supplémentaires de la liste plus longue ne sont pas affectés. Alors [1] + [3,2,0,0]donne [4,2,0,0].

                  µ      The program is two monadic fs applied in turn; an atop.
L_5.AW+“JQKA”i$€S       Helper function:
                 €        For €ach line:
L                         Get the line Length.
 _5.                      Subtract 5.5 (Numeric literals' decimal parts default to .5)
    A                     Apply Absolute value
     Ḟ                    Floor
      W                   Then Wrap it in an array. "S:AKQT6" gives [1].
        “JQKA”i$          Monadic function: index into the string "JQKA".
                €         Apply ^ over €ach char of the line; [3,2,0,0,0].
       +                  Add the two arrays together; [4,2,0,0,0].
                 S        Sum; 6.
                    S    Main link: Sum all results

Essayez-le ici .

lirtosiast
la source
3

ES6, 107 99 89 octets

s=>(t=0,[...s].map(c=>t+="JQKA".search(c)+1),s.split`
`.map(l=>t+=(l=l.length-6)^l>>4),t)
Neil
la source
2

Pyth, 27 25 24 octets

sms+a5.5ldshMxL"JQKA"d.z

Nous calculons les valeurs séparément pour chaque combinaison, puis les ajoutons.

  s m                 sum of map lambda d:  (d is a line of input)
      +                 add the
        s a                 floor of the absolute difference between
            5.5               5.5
            l d               and len(d)
          s hM xL           to the sum of the indices each incremented by one
                  "JQKA"      of each char in d in the string "JQKA"
                  d
      .z

Suite de tests .

lirtosiast
la source
1

Rétine, 77 59 octets

T`AKQJTd`5-1
:(.){0,3}(.)?
$#1$#1$#2 3$0
\S
$0$*1
+`1 1

1

Explication par lignes / paires de lignes:

  • Dans la première ligne, nous convertissons les caractères AKQJT987655432en 5432111111111. Cela signifie que pour chaque costume, nous avons une somme. Si nous avons des 0 1 2 3 4 5 6 7 ...cartes dans cette couleur, la somme est hors +3 +1 -1 -3 -4 -4 -4 -4 ...du bon score.
  • Aux lignes 2 et 3 pour corriger cela, nous ajoutons 3 à chaque ligne et avant un espace nous ajoutons des valeurs que nous soustraireons. Cette valeur soustraite est le double de la longueur des cartes avec un maximum de 3, et 1 de plus s'il y a au moins 4 cartes.
  • Dans les lignes 4 et 5, nous convertissons les chiffres en unaire en supprimant tout le reste, sauf l'espace séparateur.
  • Aux lignes 6 et 7, nous faisons une soustraction unaire.
  • À la ligne 8, nous comptons les 1'qui donnent le résultat.

Essayez-le en ligne ici.

randomra
la source
1

Stax , 18 octets

½Γ}♣▓="pì∩û╨▐M↨}╚-

Réponse la plus courte jusqu'à présent, a vaincu Jelly (même si je m'attends à être vaincu bientôt ...)

Exécutez et déboguez en ligne!

Explication

Utilise la version décompressée pour expliquer.

LZF{"JQKA"I^+i5-:++F5+
L                         Collect input in a list (if this is not needed, we can yet save another byte)
 Z                        Put a zero under the top of the stack, used as the accumulator
  F                       Loop for every suit
   {               F      Calculate the "score" for the string describing the suit
    "JQKA"I^              Find the 1-based index of current character in "JQKA", 0 for not found
            +             Add to the accumulator
             i5-:+        Subtract 5 from the current 0-based index, and take the sign
                  +       Add to the accumulator
                    5+    Add 5 extra points for each suit

Ceci est réalisé en traduisant

  • Chaque carte après la quatrième d'une couleur vous donne 1 point. Donc, si vous avez six cœurs, vous obtiendrez 2 points.
  • Un costume où vous n'avez que 2 cartes vous donne 1 point (c'est un doubleton). Une combinaison où vous n'avez qu'une seule carte vous donne 2 points (c'est un singleton). Si vous n'avez pas de cartes dans une certaine couleur, vous obtenez 3 points (c'est un vide).

À

  • Marquez 3 points supplémentaires pour chaque costume
  • Chaque carte avant la quatrième dans une couleur vous donne -1 point, chaque carte après la quatrième vous donne 1 point, la quatrième carte marque 0.

Ensuite, nous pouvons utiliser la propriété de la fonction signum.

En faisant cela, nous pouvons éviter une gestion explicite du nombre de cartes en économisant quelques octets.

Weijun Zhou
la source