Punteggio della mano del ponte


13

Una delle cose che rende molto interessante il contratto a contratto è il suo meta gioco "artificiale" altamente complicato. Questo sistema di segnare le mani è una piccola parte di esso.

Bridge è un gioco di carte divertente. Ogni giocatore riceve una mano di 13 carte e il gioco inizia con l' offerta . L'offerta determina il modo in cui il resto del gioco gioca, e quindi è una parte cruciale di esso. Al fine di garantire che tu e il tuo partner non puntiate troppo in alto (o troppo in basso), questo sistema di punteggio artificiale è stato sviluppato per dirvi quanto è buona la vostra mano.

punteggio

Ecco una mano di esempio:

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

Le S, H, D, C rappresentano i semi (picche, cuori, quadri e fiori) e il resto sono le carte in quei semi. Quindi questa mano ha una regina di picche (Q), re di picche (K), dieci di picche (T), cinque di picche, jack di cuori, sette di cuori, ecc.

Il sistema di punteggio funziona come segue:

  • Ottieni 4 punti per ogni asso (A) che hai, 3 punti per ogni re (K), 2 punti per ogni regina (Q) e 1 punto per ogni jack (J). Nessun'altra carta dà punti.
  • Ogni carta dopo la quarta in un seme ti dà 1 punto. Quindi, se hai sei cuori, otterrai 2 punti.
  • Un seme in cui hai solo 2 carte ti dà 1 punto (questo è un doppietto). Un seme in cui hai solo 1 carta ti dà 2 punti (questo è un singleton). Se non hai carte in un certo seme, ottieni 3 punti (questo è un vuoto). (Di solito questi vengono conteggiati solo dopo aver concordato una causa con il tuo partner, ma li includo per rendere la sfida più interessante.)

Quindi, la mano sopra ha 13 punti.

Sfida

Data una mano ponte nel formato mostrato sopra, calcola quanti punti ha la mano. I semi saranno sempre elencati nell'ordine di picche, cuori, quadri e fiori, e le carte saranno sempre ordinate nell'ordine A, K, Q, J, T, 9 - 2.

Ingressi e uscite di esempio

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

Questo è , quindi vince il codice più breve in byte.

Risposte:


4

Gelatina, 27 25 21 byte

Grazie @Dennis per -3 byte!

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

Questo accetta input come un elenco di righe. Per prendere l'input come stringa multilinea, precatenare a ṣ⁷µ.

Fare una tabella dei punti di frequenza:

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

possiamo vedere che sono uguali a abs(c-3.5)-.5, dove c è il numero di carte. Poiché ogni riga contiene due caratteri aggiuntivi e il numero di punti è sempre un numero intero, ecco floor(abs(l-5.5))dove l è la lunghezza della linea.

Si noti che gli indici di Jelly sono basati su 1 e anche sul comportamento delle funzioni vettorializzate su dimensioni non corrispondenti: gli elementi aggiuntivi dell'elenco più lungo non sono interessati. Quindi [1] + [3,2,0,0][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

Provalo qui .


3

ES6, 107 99 89 byte

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

2

Pyth, 27 25 24 byte

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

Calcoliamo i valori separatamente per ogni seme, quindi li aggiungiamo.

  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 di test .


1

Retina, 77 59 byte

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

1

Spiegazione per linee / coppie di linee:

  • Nella prima riga convertiamo i caratteri AKQJT987655432in 5432111111111. Questo significa che per ogni seme abbiamo una somma. Se abbiamo 0 1 2 3 4 5 6 7 ...carte in questo seme, la somma viene decurtata +3 +1 -1 -3 -4 -4 -4 -4 ...dal punteggio corretto.
  • Nelle righe 2 e 3 per correggere ciò aggiungiamo 3 ad ogni riga e prima di uno spazio aggiungiamo valori che sottrarremo. Questo valore sottratto è il doppio della lunghezza delle carte con un massimo di 3 e 1 in più se ci sono almeno 4 carte.
  • Nelle righe 4 e 5 convertiamo le cifre in unario rilasciando tutto il resto tranne lo spazio separatore.
  • Nelle righe 6 e 7 facciamo sottrazione unaria.
  • Nella riga 8 contiamo quelli 1che danno il risultato.

Provalo online qui.



1

Stax , 18 byte

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

La risposta più breve finora, ha sconfitto Jelly (anche se mi aspetto di essere sconfitto presto ...)

Esegui ed esegui il debug online!

Spiegazione

Usa la versione decompressa per spiegare.

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

Questo si ottiene traducendo

  • Ogni carta dopo la quarta in un seme ti dà 1 punto. Quindi, se hai sei cuori, otterrai 2 punti.
  • Un seme in cui hai solo 2 carte ti dà 1 punto (questo è un doppietto). Un seme in cui hai solo 1 carta ti dà 2 punti (questo è un singleton). Se non hai carte in un certo seme, ottieni 3 punti (questo è un vuoto).

Per

  • Ottieni 3 punti extra per ogni seme
  • Ogni carta prima della quarta in un seme ti dà -1 punto, ogni carta dopo la quarta ti dà 1 punto, la quarta carta segna 0.

Quindi possiamo usare la proprietà della funzione signum.

In questo modo possiamo evitare la gestione esplicita del numero di carte salvando pochi byte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.