¿Quién gana un truco de espadas?

19

Escribe el código para determinar quién gana un truco de cuatro cartas en un juego de espadas . Pocos bytes ganan.

La entrada es una cadena que enumera las cuatro cartas jugadas en secuencia como TH QC JH 2H(Diez de corazones, Reina de tréboles, Jota de corazones, Dos de corazones). Una carta viene dada por dos personajes: un palo de CDHSy un valor de 23456789TJQKA. Se le garantiza que la entrada es válida y que las tarjetas son distintas.

Debes generar un número 1, 2, 3 o 4 para el ganador del truco. En el ejemplo TH QC JH 2H, la jota de corazones gana el truco, por lo que deberías generar 3.

Su entrada y salida debe ser exactamente como se describe, excepto que las nuevas líneas finales son opcionales.

Aquí están las reglas de Spades para ganar un truco. La carta ganadora es la carta más alta de las cuatro, con algunas advertencias. Picas es el palo de triunfo , por lo que cualquier espada supera a cualquier no espada. El palo de la primera carta jugada es el palo principal , y solo las cartas de ese palo o espadas son elegibles para ganar el truco. Las cartas del mismo palo se comparan por sus valores, que se dan en orden creciente 23456789TJQKA.

Casos de prueba:

TH QC JH 2H
3
KC 5S QS 9C
3
QD 2D TD 5D
1
9S 5D AD QS
4
3D 4C 3H JH
1
9S 4S TS JS
4
5H 9H 2C AD
2
5S 4C 3H QD
1
2H 2S KH AH
2
xnor
fuente

Respuestas:

10

Pyth, 28 27 25 bytes

J"KTAZ"hxcz)eo_XN+@z1JJcz

Pruébelo en línea: Demostración o conjunto de pruebas (los primeros 4 caracteres son la construcción del conjunto de pruebas)

Gracias a @isaacg por un truco, que ahorró 2 caracteres.

La idea principal es modificar los caracteres de cada mano de tal manera que la mano ganadora tenga el valor máximo.

Los valores de las manos 23456789TJQKAya están casi ordenados. Solo tengo que reemplazar Tcon A, Kcon Ty Acon Z, lo que resulta con 23456789AJQSZ.

El orden de los trajes CDHSes para los más importantes. S, el traje más poderoso, que ya es el valor máximo. Es importante dar al traje de primera mano el segundo valor más poderoso. Entonces traduzco este traje al K.

Todas las manos también deben leerse al revés, ya que el palo es más poderoso que el valor.

                           implicit: z = input string
J"KTAZ"                    J = "KTAZ"
             o         cz  orders the hands N of split(z) by:
              _              the reversed of 
               XN+@z1JJ      N, where the values z[1]+J are replaced by J
            e              last element (winning hand)
        xcz)               index of the winning hand in split(z)
       h                   + 1
Jakube
fuente
Me
rindo
No creo que las .ecosas valgan la pena: usar oes 1 carácter más corto como lo imagino.
isaacg
@isaacg Tienes razón. Lo curioso es que tenía la solución 27 antes que la .esolución 28. Pero la solución 27 terminó con ay, por lo )tanto, también tenía 28 bytes. : oops:
Jakube
1
Pensé en una forma de guardar otros 2 caracteres: traducir de +@z1"KTA"a "KTAZ", pero en lugar de usar las cadenas directamente J"KTAZ"al principio y +@z1Jal J.
isaacg
@isaacg Muy inteligente. Gracias. Por cierto. Estoy pensando bastante en hacer el tercer argumento de Xopcional (solo si a y b son cadenas). Pero no estoy realmente seguro, si Xab)debería evaluar Xab_b(invertido b, sería bueno para cosas como Xa"</\>") o Xab+tbhb(b desplazado). Cual es tu preferencia
Jakube
6

CJam, 34 33 bytes

lS/_{)2$0='S+\#\"TQKA"_$er+}$W>#)

Algoritmo

La lógica es simple. Tengo un tipo personalizado, en el que primero doy prioridad al segundo personaje que representa el traje. En esto, Spades obtiene la máxima prioridad y luego la primera suite lanzada. Descansa todos son -1. Luego clasifico el primer personaje con el intercambio de Tcon Ay Qcon Kpara tener una clasificación léxica.

Explicación del código

En primer lugar, veamos cuál es el orden léxico de los valores nominales de las tarjetas:

"23456789TJQKA"$

23456789AJKQT

Entonces, todos los números están en la posición correcta. JTambién está en la posición correcta. Necesitamos intercambiar Kand Qy Jy Aobtener orden léxico.

lS/_{)2$0='S+\#\"TQKA"_$er+}$W>#)
lS/                                 "Read an input line and split on spaces";
   _{                      }$       "Copy the array and sort it using this custom logic";
     )                              "Take off the last character of each hand.";
      2$0=                          "Get the suit of the first hand";
          'S+                       "Add Spades suit to it";
             \#                     "Get the index of the current hand suit.
                                     1 for Spades, 0 for first hand suit, -1 otherwise";
               \                    "Put face value of this hand on top of stack";
                "TQKA"              "Put string TQKA on stack";
                      _$            "Copy and sort. This essentially reverses the string
                                     TQKA to form AKQT. This is 1 byte shorter than _W%";
                        er+         "Swap T with A and K with Q and add to the
                                     suit index calculated previously";
                                    "After the above tuple, sorting will automatically
                                     convert the tuple to string and sort lexically";
                             W>     "Get the array containing only the last element";
                               #)   "Get the index of this hand in original set and
                                     increment to convert it to 1 based";

Pruébalo en línea aquí

Optimizador
fuente
3

JavaScript (ES6), 112

Escanee la lista y devuelva la posición del valor más alto encontrado.

Ejecute el fragmento para probar (en Firefox)

F=t=>t.split(' ').map((c,i)=>(n='23456789TJQKA'.search(c[0])+(c[1]>'H'?40:c[1]==t[1]&&20))>m&&(m=n,r=i+1),m=0)|r

C.innerHTML=['TH QC JH 2H','KC 5S QS 9C','QD 2D TD 5D','9S 5D AD QS','3D 4C 3H JH','9S 4S TS JS','5H 9H 2C AD','5S 4C 3H QD'].map(h=>h+' -> '+F(h)).join('\n')
<pre id=C></pre>

edc65
fuente
3

Perl, 73 bytes

#!perl -pl
/\B./;s/$&/P/g;y/TKA/IRT/;$_=reverse;@a=sort split;/$a[-1]/;$_=4-"@-"/3

Trate de mí .

Convierte los nombres de las cartas para que el orden del valor del juego siga el orden alfabético, luego elige el más alto al ordenarlo y lo busca en la cadena original para la posición.

nutki
fuente
2

Rubí, 59 + 2 = 61

Con banderas de línea de comandos na, ejecute

p (1..4).max_by{|i|$F[i-1].tr($_[1]+'SJQKA','a-z').reverse}
histocrat
fuente
2

J, 47 bytes

1+[:(i.>./)_3+/\16!@-]i.~'SXAKQJT9876543'1}~1&{

Uso:

   (1+[:(i.>./)_3+/\16!@-]i.~'SXAKQJT9876543'1}~1&{) 'TH QC 9S 8S'
3

Método:

  • Para cada entrada de caracteres asignamos un valor basado en su posición en la 'S[second char of input]AKQJT9876543'cadena. Los caracteres no encontrados obtienen el valor last position + 1implícitamente. Otros personajes tienen mucho menos valor ( value=(16-position)!).
  • Calcule la suma para el triplete 3 input-char y un duplet (por ejemplo, TH_ QC_ 9S_y 8S).
  • Elija el índice basado en 1 del valor máximo.

(J desafortunadamente no puede comparar caracteres o cadenas directamente. Solo puede verificar su igualdad, lo que descartó algunos otros enfoques para este desafío).

Pruébelo en línea aquí.

randomra
fuente
2

C #, 237

using System;namespace S{class P{static void Main(string[] a){var V="23456789TJQKA";int x=0;int y=0;var z=a[0][1];for(int i=0;i<4;i++){int q=V.IndexOf(a[i][0])+2;var w=a[i][1];q*=w==z?1:w=='S'?9:0;if(q>y){x=i;y=q;}}Console.Write(x+1);}}}

Cómo funciona: itere cada mano para calcular el "valor" de la tarjeta ... almacene el índice de mayor valor. El valor de una carta se determina como el rango de la carta multiplicado por 0 si no es una espada o el palo de apertura, 1 si es el palo de apertura y 9 si es una espada pero no el palo de apertura. (9 elegido b / c 2 * 9 = 18> A = 14 y 9 es un solo personaje)

CÓDIGO CS
fuente
1

Pyth, 36 33 bytes

KczdhxKeo,x,ehK\SeNXhN"TKA""AYZ"K

Enfoque bastante sencillo, utiliza la clasificación con una función de tecla personalizada, luego encuentra el índice del valor más alto.

orlp
fuente
¿Intentaste evitar el tipo y solo encontraste el valor más alto? En JavaScript que resultó ser más corto
edc65
@ edc65 En Pyth no hay operación para encontrar el valor más alto, solo para ordenar. Pero con un carácter ( e) puede obtener el último elemento, por lo que encontrar el valor más alto es simplemente ordenar seguido de obtener el último elemento.
orlp
Downvoter, ¿quieres explicarlo?
orlp
1

Pyth, 31 bytes

hxczdeo}\SNo}@z1Zox"TJQKA"hNScz

Pruébalo aquí

Cómo funciona:

La forma correcta de leer este procedimiento es al revés. El procedimiento ordena la tarjeta deseada al final de la lista, luego la saca y encuentra su índice en la lista original.

  • cz: Esto genera la lista de cadenas de tarjetas. c, chop, es normalmente una función binaria (arity 2), pero cuando se llama solo en una entrada, sirve como .split()método de cadena.

  • S: Esto aplica el comportamiento de clasificación normal, que clasifica las tarjetas con números más bajos antes que las más altas.

  • ox"TJQKA"hN: Esto ordena las tarjetas por el índice ( x) en la cadena "TJQKA"de la primera letra de la tarjeta ( hN). Para tarjetas con números, no se encuentra la primera letra, dando el resultado -1. Como la función de clasificación de Pyth es estable, el orden de las tarjetas numeradas no se ve afectado.

  • o}@z1Z: Luego ordenamos por si el palo de la primera carta jugada ( @z1) está en la carta en cuestión. Como se Trueclasifica por detrás False, esto envía las cartas del palo principal a la parte posterior.

  • o}\SN: Esto es lo mismo que antes, pero ordena si la carta Sestá en la tarjeta, enviando espadas al reverso.

  • hxczde: Esto extrae la última carta ordenada de esta manera ( e), encuentra su índice en la lista de cartas ( xczd) y aumenta en 1 ( h), dando la ubicación del jugador deseado.

isaacg
fuente