2010-08-12 8 views
5

¿Hay una expresión regular para calcular la mano de póker recta?Regex para calcular la mano de póquer recta?

estoy usando cuerdas para representar las tarjetas ordenados, como:

AAAAK#sssss = 4 aces and a king, all of spades. 
A2345#ddddd = straight flush, all of diamonds. 

En Java, estoy usando estas expresiones regulares:

regexPair = Pattern.compile(".*(\\w)\\1.*#.*"); 
regexTwoPair = Pattern.compile(".*(\\w)\\1.*(\\w)\\2.*#.*"); 
regexThree = Pattern.compile(".*(\\w)\\1\\1.*#.*"); 
regexFour = Pattern.compile(".*(\\w)\\1{3}.*#.*"); 
regexFullHouse = Pattern.compile("((\\w)\\2\\2(\\w)\\3|(\\w)\\4(\\w)\\5\\5)#.*"); 
regexFlush = Pattern.compile(".*#(\\w)\\1{4}"); 

Cómo calcular los valores consecutivos (secuencias) con expresiones regulares?

EDITAR

abro otra cuestión a resolver el mismo problema, pero utilizando el valor ASCII de char, a regex ser corto. Detalles here.

Gracias!

+11

De todas las cosas extrañas que he visto expresiones regulares se utilizan para, este tiene que ser el segundo bizarrest :-) – paxdiablo

+5

No utilizar expresiones regulares para hacer esto. –

+2

¡Muy creativo! – Doug

Respuesta

4

Tengo que admitir que las expresiones regulares no son la primera herramienta que habría pensado para hacer esto. Puedo garantizar que cualquier RE capaz de hacer eso con una mano sin clasificar será mucho más horrible y mucho menos legible que el código de procedimiento equivalente.

Suponiendo que las tarjetas se ordenan por su valor nominal (y que parecen ser de otro modo sus expresiones regulares mencionados no funcionarían bien), y usted debe utilizar una expresión regular, que podría utilizar una construcción como

2345A|23456|34567|...|9TJQK|TJQKA 

para detectar el valor facial parte de la mano.

De hecho, a partir de lo que se reúnen here de las manos "estándar", lo siguiente debe ser revisado en orden decreciente de prioridad:

Royal/straight flush: "(2345A|23456|34567|...|9TJQK|TJQKA)#(\\w)\\1{4}" 
Four of a kind:  ".*(\\w)\\1{3}.*#.*" 
Full house:   "((\\w)\\2\\2(\\w)\\3|(\\w)\\4(\\w)\\5\\5)#.*" 
Flush:    ".*#(\\w)\\1{4}" 
Straight:    "(2345A|23456|34567|...|9TJQK|TJQKA)#.*" 
Three of a kind:  ".*(\\w)\\1\\1.*#.*" 
Two pair:    ".*(\\w)\\1.*(\\w)\\2.*#.*" 
One pair:    ".*(\\w)\\1.*#.*" 
High card:   (none) 

Básicamente, esos son los mismos que los suyos, excepto que he añadido el color real/escalera y la escalera. Siempre que los controles en orden, deberías obtener la mejor puntuación de la mano. No hay expresiones regulares para la carta alta ya que, en ese punto, es la única puntuación que puede tener.

También cambio las rectas (envolventes) de la rueda de acero de A2345 a 2345A ya que se ordenan de esa manera.

+0

De acuerdo. Ejecute las expresiones regulares anteriores, y luego ejecute el código de procedimiento para verificar las rectas. Eso debería ser bastante sencillo: pasar el hilo y asegurarse de que sean secuenciales. – cincodenada

+1

@cincodenada: sí, así es como lo haría. Pero a veces, los OP tienen una buena razón para hacerlo de una manera específica (por ejemplo, pueden estar usando una herramienta/marco que solo puede usar expresiones regulares). Entonces, aunque sugeriré que puede haber una mejor manera, aún intentaré ayudarlos. No me gustó la idea al principio, pero puedo ver que su código fuente sería pequeño y elegante :-) – paxdiablo

+0

Cierto, por eso comencé su respuesta y no hice la mía. Pero un buen recordatorio para darle al OP el beneficio de la duda independientemente. Gracias :) – cincodenada

Cuestiones relacionadas