2010-08-12 21 views
5

Gibt es eine Regex, um eine gerade Pokerhand zu berechnen?Regex zur Berechnung der geraden Pokerhand?

I Strings bin mit den sortierten Karten darstellen, wie:

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

In Java, ich verwende diese Regexes:

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

Wie gerade (Sequenzen) Werte berechnen mit Regex?

EDIT

öffne ich eine andere Frage das gleiche Problem zu lösen, aber ascii Wert von char verwenden, zu regex kurz sein. Details here.

Danke!

+11

Von all den bizarren Dingen, für die ich Regexes gesehen habe, müsste dies der zweite bizarrest sein :-) – paxdiablo

+5

Verwenden Sie keine regulären Ausdrücke, um dies zu tun. –

+2

Sehr kreativ !! – Doug

Antwort

4

Ich muss zugeben, dass reguläre Ausdrücke nicht das erste Werkzeug sind, an das ich gedacht hätte. Ich kann ziemlich gut garantieren, dass jeder RE, der dazu in der Lage ist, das mit einer unsortierten Hand zu tun, viel abscheulicher und weit weniger lesbar ist als der entsprechende prozedurale Code.

die Karten Unter der Annahme durch Nennwert sortiert (und sie scheinen sonst Ihre aufgeführten Regexes arbeiten entweder nicht zu sein), und Sie müssen einen regulären Ausdruck verwenden, Sie könnte verwenden, um ein Konstrukt wie

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

, um den Wertteil der Hand zu erkennen.

In der Tat, von dem, was ich here der „Standard“ Hände sammeln, sollte folgendes in der Reihenfolge abnehmender Priorität geprüft werden:

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) 

Grundsätzlich diejenigen das gleiche wie Sie sind, außer ich hinzugefügt haben der Royal/Straight Flush und der Straight. Vorausgesetzt, Sie überprüfen sie in der Reihenfolge, sollten Sie die beste Punktzahl von der Hand bekommen. Es gibt keine Regex für die hohe Karte, da es zu diesem Zeitpunkt das einzige Ergebnis ist, das du haben kannst.

Ich ändere auch die Stahlrad (Wrap-around) Straights von A2345 zu 2345A, da sie so sortiert werden.

+0

Einverstanden. Führen Sie die obigen Regexes aus, und führen Sie Prozedurcode aus, um nach Straights zu suchen. Das sollte ziemlich einfach sein - Schritt durch die Zeichenfolge und stellen Sie sicher, dass sie sequenziell sind. – cincodenada

+1

@cincodenada: Ja, so würde ich es machen. Aber manchmal haben OPs einen guten Grund, dies auf eine bestimmte Art und Weise zu tun (z. B. können sie ein Werkzeug/Framework verwenden, das nur Regexes verwenden kann). Also, während ich vorschlagen werde, dass es vielleicht einen besseren Weg gibt, werde ich immer noch versuchen, ihnen zu helfen. Ich bin anfangs nicht auf die Idee gekommen, aber ich kann sehen, dass sie ihren Quellcode klein und elegant machen würde :-) – paxdiablo

+0

Stimmt, deshalb habe ich deine Antwort kommentiert und nicht mein eigenes gemacht. Aber eine gute Erinnerung daran, dem OP den Vorteil des Zweifels zu geben. Danke :) – cincodenada

Verwandte Themen