Pyth, 73 bytes
eo_S+*-5l@\AN}SPMJ+NZSM.:+\AT5+-4l{eMJlM.gPkJ-sM*=T+`M}2Tc4"JQKA""hscd"=Zc
Esto es bastante terrible. Analizando tarjetas, ordenando los valores, ... Todo toma tantos caracteres. Pero el enfoque es interesante.
Pruébelo en línea: Demostración o conjunto de pruebas
Explicación:
Genero las 52 cartas, elimino las cuatro cartas de la entrada, genero un puntaje para cada carta (puntaje de la mano) e imprimo la carta con el puntaje máximo.
El puntaje es un poco extraño. Si comparo el puntaje de dos manos completamente diferentes, puede elegir al ganador equivocado. Por ejemplo, una escalera vencería a 4 ases. Pero funciona, si las primeras 4 cartas son iguales en ambas manos. Y mi puntaje calculado no es en realidad un valor, sino una lista de valores:
- G: Primero, agrupo las 5 cartas por rango y tomo las longitudes:
5h 5d 6c 5s Jd
->
[3, 1, 1]
- F: Luego agrego 4 menos el número de suites diferentes a esta lista.
Flush
->
3
se agrega, not flush
->
2/1/0
se agrega.
- S: agrega otro número.
0
si no es una recta, 4
si es la recta A2345
o 5
si es una recta más alta.
Estas listas de 4 a 7 números se ordenan en orden decreciente y se elige la lista con el valor máximo.
¿Por qué funciona esto? Aquí puede ver las configuraciones posibles para todos los tipos. La letra junto a los números le indica con qué regla se generó este número.
- Escalera de color:
[5S, 3F, 1G, 1G, 1G, 1G, 1G]
o[4S, 3F, 1G, 1G, 1G, 1G, 1G]
- Cuatro de un tipo:
[4G, 1G, 0F, 0S]
- Casa llena:
[3G, 2G, 1F, 0S]
o[3G, 2G, 0F, 0S]
- Rubor:
[3F, 1G, 1G, 1G, 1G, 1G, 0S]
- Recto:
[5S, 2F, 1G, 1G, 1G, 1G, 1G]
, [5S, 1F, 1G, 1G, 1G, 1G, 1G]
, [5S, 1G, 1G, 1G, 1G, 1G, 0F]
, [4S, 2F, 1G, 1G, 1G, 1G, 1G]
, [4S, 1F, 1G, 1G, 1G, 1G, 1G]
,[4S, 1G, 1G, 1G, 1G, 1G, 0F]
- Tres de una clase:
[3G, 1G, 1G, 1F, 0S]
,[3G, 1G, 1G, 0F, 0S]
- Dos pares:
[2G, 2G, 2F, 1G, 0S]
, [2G, 2G, 1F, 1G, 0S]
,[2G, 2G, 1G, 0F, 0S]
- Un par:
[2G, 2F, 1G, 1G, 1G, 0S]
, [2G, 1G, 1G, 1G, 1F, 0S]
,[2G, 1G, 1G, 1G, 0F, 0S]
- Carta alta:
[2F, 1G, 1G, 1G, 1G, 1G, 0S]
, [1F, 1G, 1G, 1G, 1G, 1G, 0S]
,[1G, 1G, 1G, 1G, 1G, 0S, 0F]
Pyth compara listas de elementos sabios. Por lo tanto, es obvio que una escalera de color siempre superará a Cuatro de un tipo. La mayoría de las reglas típicas de póker son obvias con estas listas. Algunos parecen conflictivos.
- Un Straight ganará contra Four of a kind o Full house: no hay problema. Si tienes la oportunidad de obtener Cuatro de un tipo / Casa completa con la carta de river, entonces no puedes alcanzar una escalera al mismo tiempo (ya que ya tienes 2 o 3 suites diferentes en tu mano).
- Un Straight ganará contra un color. Si puedes alcanzar un color y una escalera con la carta de river, entonces también puedes alcanzar un color directo. Y la escalera de color tiene una mejor puntuación que la escalera y el color.
- Un par
[2G, 2F, 1G, 1G, 1G, 0S]
ganará contra unas manos de dos pares. Además no hay problema. Si obtienes un par de dos con la carta de river, tienes al menos un par antes del river. Pero esto significa que puede mejorar a tres de un tipo, lo cual es mejor. Entonces, un par de dos nunca será la respuesta.
- La carta alta
[2F, 1G, 1G, 1G, 1G, 1G, 0S]
ganará contra un par de manos. Si este es el mejor puntaje que puedes alcanzar, antes del river tendrás 3 cartas de una suite y una carta de una suite diferente. Pero luego puede elegir la tarjeta con una de estas dos suites y con un valor que ya aparece, y terminará con la puntuación [2F, 2G, ...]
, que también es mejor.
Entonces esto elige el tipo correcto de solución. Pero, ¿cómo obtengo el mejor par (de 4 posibilidades), cómo elijo la mejor escalera, ...? Porque dos soluciones diferentes de un par pueden tener el mismo puntaje.
Eso es fácil. Pyth garantiza una clasificación estable (cuando se toma el máximo). Así que simplemente genero las tarjetas en el orden 2h 2s 2c 2d 3h 3s ... Ad
. Entonces la tarjeta con el valor más alto será automáticamente el máximo.
Detalles de implementacion
=Zc
divide la cadena de entrada y almacena la lista de tarjetas en Z
.
=T+`M}2Tc4"JQKA"
genera la lista de rangos ['2', ..., '10', 'J', 'Q', 'K', 'A']
y los almacena T
. -sM*T..."hscd"Z
genera cada combinación de rango con las suites y elimina las cartas de Z
.
o...
ordena estas cartas restantes por: lM.gPkJ
la longitud de los grupos de los rangos, +-4l{eMJlM
agrega 4 - longitud (suites), +*-5l@\AN}SPMJ+NZSM.:+\AT5
agrega 0/4/5 dependiendo de la suite (genera cada subcadena de longitud 5 de "A" + T, verifica si la mano uno de ellos (requiere ordenar la mano y ordenar todos los subconjuntos), multiplicar por 5 - número de "A" en la tarjeta), _S
ordena que la lista disminuya.
e
elija el máximo e imprima.
JavaScript (ES6),
329324317312309 bytesCómo funciona
Para cada carta restante en el mazo, calculamos una puntuación de mano
S
. Cuanto más bajo sea el puntaje, mejor será la mano.Variables utilizadas para calcular la puntuación
F
: falso si la mano está al rasc
: máscara de bits de clubesd
: máscara de bits de diamantesh
: máscara de bits de corazoness
: máscara de bits de espadasx = c | d
: máscara de bits de clubes o diamantesy = h | s
: máscara de bits de corazones o espadasa
: máscara de bits de todos los trajes combinadosp = c & d | x & y | h & s
: par de máscara de bits (1)t = c & d & y | h & s & x
: tres de una especie de máscara de bits (1)(1) Escribí estas fórmulas hace algunos años y las usé en varios motores de póker. Ellos trabajan :-)
Otras fórmulas
c & d & h & s
: cuatro de una especie de máscara de bitsa == 7681
: prueba para la recta especial "A, 2, 3, 4, 5" (0b1111000000001)((j = a / 31) & -j) == j
: prueba para todas las demás rectasTabla de puntuación
NB: No tenemos que preocuparnos por Two-Pair que posiblemente no sea nuestra mejor opción. (Si ya tenemos un par, podemos convertirlo en un Three of a Kind. Y si ya tenemos dos pares, podemos convertirlos en Full House).
Casos de prueba
Mostrar fragmento de código
fuente
JavaScript (ES6),
307349Esto es bastante voluminoso y no estoy seguro de que sea el mejor enfoque.
Todavía un poco golfable quizás.Menos golf
Prueba
fuente