Bridge Hand Scoring

13

Eines der Dinge, die Contract Bridge sehr interessant machen, ist das hochkomplizierte "künstliche" Metaspiel. Dieses System der Handwertung ist ein kleiner Teil davon.

Bridge ist ein trickreiches Kartenspiel. Jeder Spieler erhält 13 Karten, und das Spiel beginnt mit dem Bieten . Das Bieten bestimmt, wie der Rest des Spiels gespielt wird, und ist daher ein entscheidender Teil davon. Um sicherzustellen, dass Sie und Ihr Partner nicht zu hoch (oder zu niedrig) bieten, wurde dieses künstliche Bewertungssystem entwickelt, um Ihnen mitzuteilen, wie gut Ihre Hand ist.

Wertung

Hier ist eine Beispielhand:

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

Das S, H, D, C repräsentiert die Farben (Pik, Herz, Karo und Kreuz) und der Rest sind die Karten in diesen Farben. Diese Hand hat also eine Pik Dame (Q), einen Pik König (K), zehn Pik (T), fünf Pik, einen Herzensbrecher, sieben Herzensbrecher usw.

Das Punktesystem funktioniert wie folgt:

  • Sie erhalten 4 Punkte für jedes Ass (A), das Sie haben, 3 Punkte für jeden König (K), 2 Punkte für jede Dame (Q) und 1 Punkt für jeden Buben (J). Keine anderen Karten geben Punkte.
  • Jede Karte nach der vierten in einer Farbe gibt Ihnen 1 Punkt. Wenn Sie also sechs Herzen haben, erhalten Sie 2 Punkte.
  • Eine Farbe, bei der Sie nur 2 Karten haben, gibt Ihnen 1 Punkt (dies ist ein Dublett). Eine Farbe, bei der Sie nur 1 Karte haben, gibt Ihnen 2 Punkte (dies ist ein Singleton). Wenn Sie keine Karten in einer bestimmten Farbe haben, erhalten Sie 3 Punkte (dies ist eine Leerstelle). (Normalerweise werden diese nur gezählt, wenn Sie sich auf einen Anzug mit Ihrem Partner geeinigt haben, aber ich beziehe sie ein, um die Herausforderung interessanter zu gestalten.)

Die obige Hand hat also 13 Punkte.

Herausforderung

Berechnen Sie bei einer Brückenhand im oben gezeigten Format, wie viele Punkte die Hand hat. Die Farben werden immer in der Reihenfolge Pik, Herz, Karo und Kreuz aufgelistet, und die Karten werden immer in der Reihenfolge A, K, Q, J, T, 9 - 2 sortiert.

Beispieleingänge und -ausgänge

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

Das ist , also gewinnt der kürzeste Code in Bytes.

ein Spaghetto
quelle

Antworten:

4

Jelly, 27 25 21 Bytes

Danke @Dennis für -3 Bytes!

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

Dies nimmt Eingaben als eine Liste von Zeilen entgegen. Um Eingaben als mehrzeilige Zeichenfolge zu übernehmen, ketten Sie a vor ṣ⁷µ.

Erstellen Sie eine Tabelle mit den Frequenzpunkten:

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

wir können sehen, dass sie gleich sind abs(c-3.5)-.5, wobei c die Anzahl der Karten ist. Da jede Zeile zwei zusätzliche Zeichen enthält und die Anzahl der Punkte immer eine ganze Zahl ist, ist floor(abs(l-5.5))hier l die Zeilenlänge.

Beachten Sie, dass die Jelly-Indizes auf 1 basieren und auch das Verhalten von vektorisierten Funktionen bei nicht übereinstimmenden Dimensionen: Die zusätzlichen Elemente der längeren Liste bleiben davon unberührt. So [1] + [3,2,0,0]gibt es [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

Probieren Sie es hier aus .

Lirtosiast
quelle
3

ES6, 107 99 89 Bytes

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

Pyth, 27 25 24 Bytes

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

Wir berechnen die Werte für jeden Anzug separat und addieren sie dann.

  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

Testsuite .

Lirtosiast
quelle
1

Retina, 77-59 Bytes

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

1

Erklärung durch Linien / Linienpaare:

  • In der ersten Zeile konvertieren wir Zeichen AKQJT987655432in 5432111111111. Dies bedeutet, dass wir für jeden Anzug eine Summe haben. Wenn wir 0 1 2 3 4 5 6 7 ...Karten in dieser Farbe haben, ist die Summe um +3 +1 -1 -3 -4 -4 -4 -4 ...von der korrekten Punktzahl entfernt.
  • Um dies zu korrigieren, fügen wir in den Zeilen 2 und 3 jeder Zeile 3 hinzu und vor einem Leerzeichen fügen wir Werte hinzu, die wir subtrahieren. Dieser subtrahierte Wert entspricht der doppelten Kartenlänge mit maximal 3 Karten und 1 weiteren, wenn mindestens 4 Karten vorhanden sind.
  • In den Zeilen 4 und 5 konvertieren wir Ziffern in unäre Zeichen und löschen alles andere außer dem Trennzeichen.
  • In den Zeilen 6 und 7 subtrahieren wir unär.
  • In Zeile 8 zählen wir die Werte auf 1, die das Ergebnis ergeben.

Probieren Sie es hier online aus.

randomra
quelle
1

Stax , 18 Bytes

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

Kürzeste Antwort bisher, besiegte Jelly (obwohl ich damit rechne, bald besiegt zu werden ...)

Online ausführen und debuggen!

Erläuterung

Verwendet die entpackte Version, um zu erklären.

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

Dies wird durch Übersetzen erreicht

  • Jede Karte nach der vierten in einer Farbe gibt Ihnen 1 Punkt. Wenn Sie also sechs Herzen haben, erhalten Sie 2 Punkte.
  • Eine Farbe, bei der Sie nur 2 Karten haben, gibt Ihnen 1 Punkt (dies ist ein Dublett). Eine Farbe, bei der Sie nur 1 Karte haben, gibt Ihnen 2 Punkte (dies ist ein Singleton). Wenn Sie keine Karten in einer bestimmten Farbe haben, erhalten Sie 3 Punkte (dies ist eine Leerstelle).

Zu

  • Erziele 3 Extrapunkte für jede Farbe
  • Jede Karte vor der vierten in einer Farbe gibt Ihnen -1 Punkt, jede Karte nach der vierten gibt Ihnen 1 Punkt, die vierte Karte zählt 0.

Dann können wir die Eigenschaft der signum-Funktion nutzen.

Auf diese Weise vermeiden wir den expliziten Umgang mit der Anzahl der Karten, wodurch einige Bytes eingespart werden.

Weijun Zhou
quelle