Pregunta

¿Hay una expresión regular para calcular directamente la mano de póquer?

Estoy usando cuerdas para representar las tarjetas clasificadas, 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, expresiones regulares a ser corta. Detalles aquí .

Gracias!

¿Fue útil?

Solución

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

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

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

para detectar la parte de valor nominal de la mano.

De hecho, a partir de lo que se reúnen aquí de la manos "estándar", a continuación se deben verificarse 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 real / escalera de color y de la recta. Siempre y cuando ellos y comprueba con el fin, usted debe conseguir la mejor puntuación de la mano. No hay expresiones regulares de la carta más alta, ya que, en ese momento, es el único resultado que puede tener.

También cambié la rueda de acero (envolvente) rectas de A2345 a 2345A ya que va a ser ordenados de esa manera.

Otros consejos

Me volvió a escribir la expresión regular para esto porque me pareció frustrante y confuso. Agrupaciones tienen mucho más sentido para este tipo de lógica. La clasificación se hace uso de un método de arreglos de tipo estándar en javascript por lo tanto, la extraña orden de las cartas, que están en orden alfabético. Hice la mía en javascript, pero la expresión regular podría aplicarse a Java.

hands = [
    { regex: /(2345A|23456|34567|45678|56789|6789T|789JT|89JQT|9JKQT|AJKQT)#(.)\2{4}.*/g , name: 'Straight flush' },
    { regex: /(.)\1{3}.*#.*/g , name: 'Four of a kind' },
    { regex: /((.)\2{2}(.)\3{1}#.*|(.)\4{1}(.)\5{2}#.*)/g , name: 'Full house' },
    { regex: /.*#(.)\1{4}.*/g , name: 'Flush' },
    { regex: /(2345A|23456|34567|45678|56789|6789T|789JT|89JQT|9JKQT|AJKQT)#.*/g , name: 'Straight' },
    { regex: /(.)\1{2}.*#.*/g , name: 'Three of a kind' },
    { regex: /(.)\1{1}.*(.)\2{1}.*#.*/g , name: 'Two pair' },
    { regex: /(.)\1{1}.*#.*/g , name: 'One pair' },
  ];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top