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.