Me gustan los desafíos de los juegos de cartas, así que hice este para el juego de cartas italiano Scopa. Mi familia ha estado jugando este juego desde tiempos inmemoriales. Tiene un sistema de puntuación muy interesante que debería ser divertido para el golf. Publicaré una respuesta en R para comenzar la diversión, y estoy seguro de que la gente mejorará.
El desafío: calcular el número de puntos anotados en una ronda de Scopa, dadas las cartas que el jugador capturó durante la ronda como entrada.
Hay 40 cartas en un mazo de Scopa. Si estás usando un mazo internacional, eliminas los 8, 9 y 10, dejando A, 2,3,4,5,6,7, Q, J, K en cada palo. 1 Hay dos jugadores o asociaciones, y después de cada ronda, todas las cartas terminan siendo capturadas por uno u otro de los dos jugadores. El puntaje se cuenta de la siguiente manera (más información aquí ):
- El jugador con más cartas gana 1 punto.
- El jugador con más diamantes (o monedas si usa el mazo italiano) obtiene 1 punto.
- El jugador con el 7 de diamantes (o monedas), conocido como sette bello o beautiful seven, obtiene 1 punto.
- El jugador con el primiera más alto obtiene 1 punto. El puntaje principal de un jugador es la suma de los puntajes de la carta de mayor valor que el jugador capturó en cada palo (ver la tabla a continuación). Si no tienes al menos una carta en cada palo, pierdes por defecto incluso si tu puntaje excede el puntaje de tu oponente. En el caso extremadamente raro de que ninguno de los jugadores tenga al menos una carta en cada palo, el jugador con el total de primiera más alto gana el punto. 2
Tabla de puntajes primiera
| Rank | Value |
| ----- | ----- |
| 7 | 21 |
| 6 | 18 |
| A | 16 |
| 5 | 15 |
| 4 | 14 |
| 3 | 13 |
| 2 | 12 |
| Q,J,K | 10 |
Por lo tanto, un jugador puede anotar como máximo 4 puntos en una ronda. 3 Si hay un empate, que es posible para tarjetas, diamantes o primiera , nadie gana el punto.
Es importante darse cuenta de que, dado que cada carta debe ser capturada por uno de los dos jugadores, puede inferir qué cartas debe haber tomado el otro jugador, incluso si solo sabe qué cartas tomó un jugador. Tendrá que hacer esto para puntuar correctamente primiera .
Reglas de desafío
Entrada
Su código debe tomar como entrada las cartas capturadas por un solo jugador durante una ronda de Scopa.
La entrada debe estar en formato de cadena, en el que un personaje representa el rango de cada carta y un personaje su palo. Esto elimina la laguna potencial de pasar laspuntuaciones primarias directamente como entrada. La conversión de los rangos de cartas apuntajes primarios debe hacerse en el programa. Sin embargo, puede optar por utilizar una sola cadena separada por espacios o comas, una matriz de cadenas o cualquier otro formato. Por ejemplo, si elige codificar rangos como76A5432QJK
y se adapta comoDCHS
podría usar entradas como['7D', '6H', 'QD', 'JS']
o'7D,6H,QD,JS'
.
Salida
Un número entero de 0 a 4 que representa la puntuación del jugador.
Victorioso
¡La respuesta más corta en bytes gana!
Casos de prueba
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "7C", "6C", "4C", "3C", "2C", "7H", "4H", "2H", "5S", "3S", "QS", "JS", "KS"]
Puntuaciones 4 : 1 punto por> 20 cartas, 1 punto por> 5 diamantes, 1 punto por el 7 de diamantes y 1 punto por anotar 78 en primiera (7,7,7,5 donde el oponente tiene 7,6,5, K para 64)
["3D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "QC", "4H", "7S"]
Puntuaciones 0 : <= 20 cartas, <= 5 diamantes, no 7 de diamantes, y solo puntúa 69 en primiera (7,7,4,3 donde el oponente tiene 7,7,6, K por 70)
[7D", "6D", "AD", "5D", "4D", "3D", "2D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "7H", "6H", "AH", "5H", "4H", "3H", "2H"]
Puntajes 3 : 1 punto por> 20 cartas, 1 punto por> 5 diamantes, 1 punto por 7 de diamantes. La primiera sería 63 (7,7,7) y el oponente solo puede anotar 51 (7, Q, Q, Q) pero como esta mano no tiene espadas, pierde el punto por defecto.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH", "QS"]
Puntajes 3 : <= 20 cartas, 1 punto por> 5 diamantes, 1 punto por 7 de diamantes. El primiera solo obtiene 51 (7, Q, Q, Q) y el oponente puede obtener 63 (7,7,7), pero como la mano del oponente no tiene diamantes, esta mano gana el punto primiera por defecto.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "7C", "7H"]
Puntajes 3 : <= 20 cartas, 1 punto por> 5 diamantes, 1 punto por 7 de diamantes. Aunque esta mano no tiene espadas, aún gana primiera por un puntaje de 63 a 57 (7,7,7 versus 7,6,6) porque la mano del oponente no tiene diamantes.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH"]
Puntajes 2 : <= 20 cartas, 1 punto por> 5 diamantes, 1 punto por 7 de diamantes. Esta mano no tiene espadas, y la mano del oponente no tiene diamantes. El oponente gana primiera por un puntaje de 63 a 41 (7,7,7 versus 7, Q, Q).
[]
(matriz vacía)
Puntuaciones 0
1: Al menos en nuestra familia, Jack supera a Queen en Scopa, pero esto es irrelevante para fines de puntuación.
2: He estado jugando a este juego desde la infancia y nunca he visto que eso suceda, ¡pero es mejor que tu código pueda manejar ese caso!
3: Hay puntos de bonificación por "barridos" anotados durante la ronda que estoy ignorando a los efectos de este desafío.
fuente
Respuestas:
Rubí,
156153 bytesPruébalo en línea!
Esto se usa
;865432000
para representar76A5432QJK
respectivamente, y los trajes están en minúsculas. (La elección de los caracteres se debe a que restar 38 de cada uno da su valor principal, pero en realidad nunca lo hacemos porque solo importa la diferencia relativa).No verificamos si a ninguno de los jugadores le falta un palo porque es innecesario, ya que todas las cartas se cuentan como 38 más su valor real, si a alguien le falta un palo, la puntuación más alta que puede obtener es (21 + 38) * 3 = 177, que es menor que (10 + 38) * 3 + 21 + 38 = 203, el puntaje más bajo que puede obtener el otro jugador. No podemos hacer que los dos jugadores pierdan un número desigual de palos distintos de cero, porque a un jugador solo le pueden faltar 0, 1 o 2 palos, y si a alguien le faltan 2 palos, tienen todas las cartas de los otros 2 palos.
fuente
R,
320298265238229224211209179 bytesEsta es una solución principalmente debido a @digEmAll, en forma de una función.
Pruébalo en línea!
A continuación se muestra el mejor de mis viejos intentos mediocres de 209 bytes.
editar: jugar golf aliasing algunas funciones, luego tomando la idea de Doorknob de agregar una constante a la puntuación en lugar de verificar los palos.
próxima edición: se deshizo de la redundancia y luego incorporó algunas mejoras de Giuseppe
próxima edición: -2 bytes gracias a digEmAll
Soy terrible en esto, así que estoy seguro de que alguien puede mejorar en esto si les importa tomarse el tiempo. Me siento como el
sapply
yfunction
son muy largos y podría deshacerme de ellos, pero no puedo entender cómo. Las entradas son cadenas de dos caracteres en la notación estándar.fuente
JavaScript (ES6),
171163 bytesToma datos como un conjunto de tarjetas, utilizando su representación estándar.
Pruébalo en línea!
Comentado
fuente
05AB1E , 41 bytes
Pruébelo en línea o verifique todos los casos de prueba .
Los trajes
DCHS
están representados respectivamente por0123
. Rangos7A65432KJQ
están representados respectivamente por0123456789
. Esos se toman como cadenas, no enteros, como lo requiere el desafío (pero 05AB1E los convierte en enteros cuando sea necesario de todos modos).Como en otras soluciones, agregamos una constante grande (14) a cada puntaje primiera para hacer innecesaria la verificación de los trajes faltantes.
fuente
MS SQL Server 2017 , 525 bytes
Pruébalo en db <> fiddle .
fuente
Retina 0.8.2 , 334 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Explicación:
Crea una lista de las 40 cartas.
Retira las cartas que tiene el jugador.
Reemplace cada rango por su orden de clasificación, que es 9 para
7
y 10 menos que su valor para otras cartas.Ordenar las cartas por palo y rango.
Cuente el número de cartas en cada palo y también capture la carta mejor clasificada en cada palo, capturando el diamante más alto dos veces.
Compruebe si el diamante más alto fue el 7.
Elimina todas las cartas más altas si uno de los palos no tiene cartas.
Convierta las cartas más altas a su puntaje unario y sumelas. También convierta el número total de tarjetas y longitudes de palo a unario.
Gana puntos si el total, diamantes o primiera, es mayor.
Total de la puntuación.
fuente
C # (compilador interactivo de Visual C #) , 193 bytes
Pruébalo en línea!
fuente
AWK , 235 bytes
Pruébalo en línea!
Los trajes se asignan a 1234 (4 son diamantes), los valores se asignan a 0123456789. Este programa transforma los casos de prueba en el formato aceptado:
Mi objetivo era simplemente vencer a la implementación líder de Python: D
fuente
Python 3 ,
249 245 239238 bytes-4 bytes gracias a @ovs
-6 bytes gracias a @movatica
Pruébalo en línea!
fuente
int('0734569c00'[int(x[0])],13)
yif x[1]<'E'
se puede escribir comoif'E'>x[1]
all(s in''.join(C)for s in S)
se puede acortar anot S.strip(''.join(C))
, ahorrando 6 bytes