El reto:
En esta pregunta: Nombre la mano de póker que tuvo que tomar una mano de póker de cinco cartas e identifíquela. Esta pregunta es similar, con dos giros:
Primero, la salida será en minúsculas. Esto permite más golf, ya que no tiene que preocuparse por la capitalización flush
ystraight
high card
one pair
two pair
three of a kind
straight
flush
full house
four of a kind
straight flush
royal flush
En segundo lugar, con la popularidad de Texas Hold'em y 7 card stud, aquí en code golf deberíamos poder anotar una mano de póker de siete cartas, ¿verdad? Al anotar una mano de siete cartas, use las cinco mejores cartas para su mano e ignore las dos que no necesita.
Referencia:
Lista de manos de póker: http://en.wikipedia.org/wiki/List_of_poker_hands
Entrada (levantada directamente del hilo anterior)
7 cartas de argumentos estándar o de línea de comandos. Una tarjeta es una cadena de dos letras en el formulario RS
, donde R es rango y S es palo. Los rangos son 2
: 9
(tarjetas de números), T
(diez), J
(Jack), Q
(Reina), K
(Rey), A
(As). Los trajes son S
, D
, H
, C
de picas, diamantes, corazones y clubes respectivamente.
Ejemplo de cartas
5H - five of hearts
TS - ten of spades
AD - ace of diamonds
Ejemplo de entrada => salida deseada
3H 5D JS 3C 7C AH QS => one pair
JH 4C 2C 9S 4H JD 2H => two pair
7H 3S 7S 7D AC QH 7C => four of a kind
8C 3H 8S 8H 3S 2C 5D => full house
AS KC KD KH QH TS JC => straight
Observe que en el segundo ejemplo en realidad hay tres pares, pero solo puede usar cinco cartas, así que es two pair
. En el quinto ejemplo, hay a three of a kind
y a straight
posibles, pero a straight
es mejor, por lo tanto, la salida straight
.
Puntuación
Este es el código de golf , ¡el código más corto gana!
Erratas
- No puede usar recursos externos.
- As es tanto alto como bajo para las rectas.
Respuestas:
Rubí 353
Esto se basó en la respuesta de Chron de la pregunta original.
Esto toma la entrada como argumentos de línea de comando. Básicamente, simplemente iteramos sobre todas las combinaciones de tamaño 5 para obtener qué tipo de mano es. Cada tipo de mano se modificó para que comience con un número. ("escalera real" -> "0royal 4flush", "carta alta" -> "carta 9high"). Esto nos permite ordenar las cadenas que se devolvieron. La primera cadena después de ordenar es la mejor mano posible. Entonces imprimimos eso después de eliminar todos los números de la cadena.
fuente
AS QS JS TS 9S 5H 5D
. ¡Eso te costará un personaje!Haskell
618 603 598 525 512 504 480464Tarjetas tomadas como una línea de entrada. Creo que he jugado al golf hasta la muerte, pero será fácilmente derrotado por el rubí, etc. con el mismo truco: si genera todas las permutaciones, obtendrá el tipo de avance que desea buscar rectas, más el tipo de reverso que desea para probar N de una especie.
Editado para "emparejar" en línea y usar prefijos de números después de ver la entrada de @ FDinoff, también compuso funciones de mapa para afeitar un carácter más.
fuente
"one pair","two pair"
es más corto entoncesu=" pair" ... "one"++u,"two++u
C ++,
622553 caracterescuatro líneas nuevas innecesarias agregadas a continuación para mayor claridad.
Las cosas cambiaron en la versión de golf:
Rev 1: Se cambiaron todas las variables numéricas para
__int64
una sola declaración.Rev 1: Incremento de golf y condición de
for
buclesRev 0: Cambió las constantes octales a decimal.
Rev 0: Cambió las
if
declaraciones a asignaciones con operador condicional. Rev 1: Reorganizado aún más en una sola expresión parat
. Esto requirió una nueva variablev
para uno de los valores intermediosRev 0: salida detallada eliminada. Solo genera la mejor mano en general.
Rev 0: me di por vencido al comprimir el texto de salida (difícil en C porque no se pueden concatenar cadenas con el operador +). Escribir "vaciar" solo una vez me salvó 12 caracteres, pero me costó 15, empeorando en general 3 caracteres. Así que lo escribí 3 veces en su lugar.Rev 1: se utiliza enstd::string
lugar dechar[]
lo sugerido por FDinoff, lo que hace posible concatenar con+
.Versión sin golf, 714 caracteres sin espacios en blanco sin comentarios.
Recorre las 21 manos posibles que se pueden hacer con 7 cartas y rechaza 2 cartas cada vez. El palo y el rango de las cinco cartas elegidas se totalizan en las variables f y p con un dígito octal diferente para cada palo / rango. Se realizan varias operaciones de bits para determinar el tipo de mano, que luego se almacena en t (las 21 posibilidades se emiten en la versión sin golf). Finalmente, se emite la mejor mano posible.
Salida sin golf
fuente
<string>
que admite + para la concatenación de cadenas. Lo que significa que probablemente podría usar<iostream>
y usarcout
Sin embargo, en realidad no sé si alguno de ellos conduciría a un recuento de caracteres más pequeño." pair flush flush straight of a kind"
= 35 caracteres. Una vez que agregue los#include
ahorros son mínimos, entonces debe considerar extra",=+
y declaraciones de constantes. Además, soy nuevo en C ++ y tengo dificultades con la configuración de IDE y del compilador (me obliga a usarscanf_s
y, enprintf_s
lugar de las viejas versiones "inseguras" y la ayuda para solucionarlo va en círculos.)cout
Podría ayudar un poco, depende de mí lista, pero probablemente para otro programa. Lo quecout
me mata esusing namespace std
que no sé si hay una manera de evitar escribir todo eso.std::cout
moverte por elusing namespace std
gets_s
&puts
, ademásstd::string
de concatenar, lo que significa que debo convertirchar*
a salida. El golf que publiqué funciona con solostring
oiostream.
extrañamente. Debo incluir ambos para usar<<>>
operadores concin/cout
&std::string
s. En general, usar ambos#include
s funciona 5 bytes peor, a pesar de que puedo declararh
como aystd::string
evitar unachar
declaración por separado . Como era de esperar, no puedo encontrar una lista de lo que está ennamespace std
ayuda (o una explicación sobre el operador).scanf
ygets
, a excepción del golf, donde los programas son bastante inseguros de todos modos. Podría acortar en 5 bytes-s,99
si pudiera usar engets
lugar degets_s
, pero no puedo conseguir que el compilador me lo permita. ¡Lo que me sorprende es lo inseguro que es C / C ++ en general! Hace unas semanas me habría sorprendido descubrir que_int64 x=1<<y
da una respuesta incorrecta para mayores de 31 años. Pero ahora estoy un poco molesto. Habiendo visto cosas con subíndices de matriz fuera de límites sin mensaje de error, me he acostumbrado. ¿Hay alguna forma de mejorar el control?Perl (> = 5,14),
411403400397400Editar : en línea un sub que solo se llamó una vez, ahorrando 8 caracteres.
Edición 2 : eliminó un
.""
sobrante de un intento anteriorEdición 3 : en lugar de una variable temporal que conserva el original
$_
, use uno para que sea innecesario. Ganancia neta 3 caracteres.Edición 4 : error solucionado para detectar la casa completa demasiado llena (2x 3 de su tipo). cuesta 3 caracteres
No es un gran ganador, pero creo que el detector directo es un concepto interesante.
Versión ampliada:
fuente
JavaScript 600
uso con nodeJS:
node code.js "7H 3S 7S 7D AC QH 7C"
fuente