2010-08-12 5 views
5

Existe-t-il une regex pour calculer la main droite du poker?Regex pour calculer la main droite du poker?

J'utilise des chaînes pour représenter les cartes triées, comme:

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

En Java, j'utilise ces expressions rationnelles:

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}"); 

Comment calculer les valeurs droites (séquences) avec regex?

EDIT

J'ouvre une autre question à résoudre le même problème, mais en utilisant la valeur ascii de char, à regex être courte. Détails here.

Merci!

+11

De toutes les choses bizarres pour lesquelles j'ai vu des regexes, cela devrait être le deuxième bizarrest :-) – paxdiablo

+5

N'utilisez pas d'expressions régulières pour cela. –

+2

Très créatif !! – Doug

Répondre

4

Je dois admettre que les expressions régulières ne sont pas le premier outil auquel j'aurais pensé pour le faire. Je peux à peu près garantir que tout ER capable de faire cela à une main non triée va être beaucoup plus hideux et beaucoup moins lisible que le code procédural équivalent.

En supposant que les cartes sont triées par valeur nominale (et ils semblent être autrement vos expressions rationnelles énumérées ne fonctionneraient pas non plus), et vous doit utiliser une expression régulière, vous pourrait utiliser une construction comme

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

pour détecter la partie faciale de la main.

En fait, d'après ce que je comprends here des mains « standard », ce qui suit doit être vérifié par ordre de priorité décroissante:

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) 

En fait, ce sont les mêmes que les vôtres sauf que j'ai ajouté la couleur royale/droite et la ligne droite. Pourvu que vous les vérifiez dans l'ordre, vous devriez obtenir le meilleur score de la main. Il n'y a pas de regex pour la carte haute puisque, à ce stade, c'est le seul score que vous pouvez avoir.

Je change également les droites de roue en acier (wrap-around) de A2345 à 2345A puisqu'elles seront triées de cette façon.

+0

D'accord. Exécutez les expressions régulières ci-dessus, puis exécutez le code de procédure pour vérifier les lignes droites. Cela devrait être assez simple - passer par la chaîne et assurez-vous qu'ils sont séquentiels. – cincodenada

+1

@cincodenada: oui, c'est comme ça que je le ferais. Mais parfois, les PO ont une bonne raison de le faire d'une manière spécifique (par exemple, ils peuvent utiliser un outil/cadre qui ne peut utiliser que des expressions rationnelles). Donc, même si je suggère qu'il y a peut-être un meilleur moyen, j'essaierai quand même de les aider. Je ne me suis pas contenté de l'idée au début mais je peux voir que cela rendrait leur code source petit et élégant :-) – paxdiablo

+0

C'est vrai, c'est pourquoi j'ai commenté ta réponse et je n'ai pas fait la mienne. Mais un bon rappel pour donner au PO le bénéfice du doute malgré tout. Merci :) – cincodenada

Questions connexes