Descargo de responsabilidad: ModTen es un juego de cartas de ficción creado con el único propósito de este desafío.
Las reglas de ModTen
ModTen se juega con una baraja estándar de 52 cartas. Debido a que las reglas completas aún no se han inventado, nos vamos a centrar exclusivamente en la clasificación de manos.
Una mano ganadora en ModTen. Gráficos de Wikipedia .
Valores de la tarjeta
Las tarjetas tienen los siguientes valores:
- 2 a 9 : vale su valor nominal
- Diez : 0 puntos
- Jack : 3 puntos
- Reina o Rey : 8 puntos
- As : 9 puntos
Valores de la mano
Una mano ModTen está hecha de dos cartas . El valor base de una mano se obtiene multiplicando el valor de ambas cartas y manteniendo solo el último dígito (es decir, aplicando un módulo 10).
.
La única otra regla en ModTen es que las cartas adecuadas valen más que las no adecuadas. Por convención, vamos a agregar una "s" al valor si ambas cartas son del mismo palo.
Por ejemplo, el valor de 9 ♠ - 5 ♠ se anotará como " ", porque y las cartas son adecuadas.
Clasificación de manos y ganador
Las reglas anteriores dan como resultado 18 rangos de mano distintos que se resumen en la siguiente tabla, desde la más fuerte a la más baja (o la más rara a la más común). Las probabilidades se dan solo para información.
Con dos manos, gana la mano con el rango más bajo. Si ambas manos son del mismo rango, entonces es un empate (no hay desempate).
hand rank | hand value(s) | deal probability
-----------+---------------+------------------
1 | 9s | 0.30%
2 | 3s | 0.60%
3 | 1s | 0.90%
4 | 7s | 1.21%
5 | 5s | 1.51%
6 | 3 | 1.81%
7 | 9 | 2.26%
8 | 8s | 2.71%
9 | 6s | 3.02%
10 | 1 or 7 | 3.62% each
11 | 2s or 4s | 3.92% each
12 | 5 | 4.98%
13 | 0s | 5.43%
14 | 8 | 8.14%
15 | 6 | 9.95%
16 | 2 | 11.76%
17 | 4 | 13.57%
18 | 0 | 16.74%
El reto
Dadas dos manos ModTen , genere uno de los tres valores consistentes de su elección para saber si:
- el primer jugador gana
- el segundo jugador gana
- es un empate
Se aplican las siguientes reglas:
- Una tarjeta debe ser descrito por su rango en mayúsculas (
2
,3
, ...,9
,T
,J
,Q
,K
oA
), seguido de su demanda en minúsculas (c
,d
,h
os
, para los tréboles, diamantes, corazones y picas). - Puede usar en
"10"
lugar de,"T"
pero cualquier otra sustitución está prohibida. Siempre y cuando se sigan las reglas anteriores, puede tomar las manos en cualquier formato razonable y sin ambigüedades. Se le permite tomar el rango y el palo como dos personajes distintos en lugar de una sola cadena.
Algunos formatos de entrada válidos son:
"7c Qh 8s Ks"
[["7c","Qh"], ["8s","Ks"]]
[[['7','c'], ['Q','h']], [['8','s'], ['K','s']]]
- etc.
En lugar de usar 3 valores distintos consistentes, su salida también puede ser negativa , positiva o cero . Por favor, especifique el formato de salida utilizado en su respuesta.
- Este es el código de golf .
Casos de prueba
El jugador 1 gana
["Js","3s"], ["Ks","Kh"]
["7h","9h"], ["9s","7c"]
["Ah","5s"], ["Ts","8s"]
["Ts","8s"], ["Jh","2s"]
["4h","8s"], ["Qh","Ks"]
El jugador 2 gana
["Th","8d"], ["6s","Kd"]
["Jc","5c"], ["3s","9s"]
["Jc","Jd"], ["9h","Ah"]
["2d","4d"], ["3h","3s"]
["5c","4c"], ["3c","2c"]
Dibujar
["Js","3s"], ["3d","Jd"]
["Ah","Ac"], ["3d","9s"]
["Qc","Kc"], ["6d","4d"]
["2d","3d"], ["3s","2s"]
["Ts","9c"], ["4h","5d"]
fuente
{{J, s}, {3, s}}
estaría bien?Respuestas:
Python 3 ,
114110 bytesPruébalo en línea!
@Arnauld propuso la idea de fusionar el valor de la tarjeta y las cadenas de la tabla de clasificación. Después de algunos intentos, logré crear una cadena combinada
R="T 2J45UNK9RL<3SLM;QAK:O>=/678"
, que tiene la misma longitud que la cadena de valor de la tarjeta original. La subcadenaR[6:25]="UNK9RL<3SLM;QAK:O>=/"
sirve como mesa de rango, así como una tabla de consulta de valor de la tarjeta de3
,9
,A
,K
, yQ
. La decodificación de valor ASCII de la nueva tabla de clasificación tiene el mismo efecto de clasificación que la tabla de clasificación anterior.El uso de cadenas de bytes como entrada ahorra 4 bytes.
El uso
cmp
en Python 2 puede reducir la solución a 102 bytes, como se muestra en la solución de @ xnor .Python 3 ,
165142130129 bytesPruébalo en línea!
-23 bytes gracias a @Jonathan Allan
-2 bytes gracias a @ovs
-1 byte gracias a @mypetlion
Sin golf:
La función
f
toma dos argumentos que representan la mano del jugador 1 y el jugador 2. Devuelve un valor positivo, negativo o cero en el caso de que un jugador 1 gane, un jugador 2 gane o un empate, correspondientemente. Cada mano está codificada como una sola cadena, por ejemplo, "7cQh".fuente
"HC92FA51GAB4E893D760"[s==t::2]
cmp
no está disponible en Python 3)str.find
lugar destr.index
guardar un byte. La única diferencia de comportamiento entre los dos métodos es queindex
arroja un error cuando no se encuentra el elemento, mientras quefind
regresa-1
. Por lo tanto, no será un problema para su código.Asamblea x86-16,
8783 bytesBinario:
Desmontado:
La entrada es como una cadena como
Js3sKsKh
, en el puntero enSI
. La salida esZF = 0 and SF = OF
(prueba conJG
) si el jugador 1 gana,SF ≠ OF
(prueba conJL
) si el jugador 2 gana oZF
(prueba conJE
) si un empate.Salida usando el programa de prueba DOS:
Descargue y pruebe MODTEN.COM para DOS.
fuente
05AB1E ,
4137 bytes-4 bytes gracias a @Grimy .
Ingrese como una lista de la lista de caracteres, como el tercer formato de entrada de ejemplo en la descripción del desafío. Es decir, P1
7c Qh
y P28s Ks
se ingresarán como[[["7","c"],["Q","h"]],[["8","s"],["K","s"]]]
. (Y usos"10"
para10
)Emite un entero negativo si el jugador 1 gana; un entero positivo si el jugador 2 gana; o 0 si es un empate.
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
Vea esta sugerencia mía 05AB1E (secciones ¿Cómo usar el diccionario? ¿Cómo comprimir enteros grandes? Y ¿Cómo comprimir listas enteras? ) Para comprender por qué
•V›{₆Ÿ&∊WÍj¸•
es36742512464916394906012008
,•V›{₆Ÿ&∊WÍj¸•19в
es[18,10,16,6,17,12,15,10,14,7,13,3,11,2,11,5,9,4,8,1]
,‘ߌQ‘
es"JAKEQ"
yŽćS
es39808
.fuente
T
como10
, por lo que sólo puede caer elT
deJTQKA
(y el uso comprimido entero de 3889 en lugar de 30.889). Además,T* ... +
podría ser... «
.10
lugar de estarT
permitido, pero no pensé enT*...+
ser...«
es obvio ahora que lo veo ..>.> ¡Gracias!PHP ,
212185178149 bytesPruébalo en línea!
La entrada es a través de la línea de comando. La salida a
STDOUT
es negativa si el jugador 1 gana, positiva si el jugador 2 gana,0
si empata. Ejemplo:fuente
-1
,1
o0
.Jalea , 46 bytes
Pruébalo en línea!
Un programa completo que toma como argumento, por ejemplo,
["7h","Ks"],["4s","Ts"]
e imprime cero si ambos jugadores empatan, positivo si el jugador 1 gana y negativo si el jugador 2 gana.fuente
C (gcc) ,
172167165164 bytesPruébalo en línea!
¡2 bytes eliminados gracias a @ceilingcat!
Básicamente un puerto de la solución Python3 de @ Joel, pero sin la codificación base18. Espera la entrada como una cadena con un espacio que separa las manos de los dos jugadores, y genera un número entero que es positivo, negativo o cero para indicar que el jugador 1 gana, el jugador 2 gana o si es un empate.
fuente
Perl 6 ,
1011009488 bytes-1 byte gracias a Jo King
Pruébalo en línea!
Toma la entrada como se
f(((<J ♠>, <3 ♠>), (<10 ♠>, <K ♥>)))
usa10
para Ten. Devuelve un valor <0 si el jugador 1 gana,> 0 si el jugador 2 gana, 0 si es un empate.Explicación
fuente
Carbón , 97 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Toma la entrada como dos cadenas de 4 caracteres, por ejemplo,
QcKc
6d4d
y genera un entero con signo. Explicación:La cadena comprimida
2345678903889
representa los valores de la tarjeta.Pase sobre cada posible par de valores.
Pase sobre cada posible segundo palo de la tarjeta. Sin pérdida de generalidad, podemos suponer que la primera carta tiene el palo 3, por lo que la segunda carta puede variar de 0 a 3 a menos que los valores sean los mismos, en cuyo caso solo puede variar de 0 a 2.
Calcule la puntuación modificada de la mano, que es el valor de la mano duplicada, más 1 si los palos son iguales (es decir, la segunda carta tiene el palo 3).
La cadena comprimida
23456789TJQKA
representa los caracteres de la tarjeta. Las tarjetas de entrada se buscan en esta cadena y luego la posición se usa para indexar en la primera cadena para obtener el valor de la tarjeta.Inicializa el resultado a 0.
Pase sobre las dos manos.
Calcule el puntaje modificado de la mano y, por lo tanto, su frecuencia, y reste el resultado de esto.
Salida de la diferencia de frecuencia.
fuente
C # (compilador interactivo de Visual C #) , 139 bytes
Pruébalo en línea!
fuente
Perl 5
-p
, 107 bytesPruébalo en línea!
Entrada:
(En realidad, la coma puede ser cualquier personaje).
Salida:
fuente