Frage

Gibt es eine Regex gerade Poker-Hand zu berechnen?

Ich bin Strings 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 mit regex berechnen?

Bearbeiten

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

Danke!

War es hilfreich?

Lösung

Ich muss zugeben, dass reguläre Ausdrücke sind nicht das erste Werkzeug, das ich dies zu tun hätte gedacht. Ich kann ziemlich garantieren, dass jede RE dazu in der Lage, das zu einer unsortierten Hand geht weit häßliche und weit weniger lesbar als der entsprechende Verfahrenscode sein.

Unter der Annahme, werden die Karten nach Nennwert sortiert (und sie zu sein scheinen sonst Ihre aufgeführten Regexes würde auch nicht funktionieren), und Sie muss einen regulären Ausdruck verwenden, können Sie könnte verwenden, um ein Konstrukt wie

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

den Nennwert Teil der Hand zu erkennen.

In der Tat, von dem, was ich sammeln hier der „Standard“ Hände, die folgendes sollten 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 sind solche, die gleiche wie Sie außer ich habe den royal / Straight Flush und die gerade hinzugefügt. Sofern Sie sie, um zu überprüfen, sollten Sie das beste Ergebnis aus der Hand. Es gibt keinen regulären Ausdruck für die hohe Karte, da an diesem Punkt, es ist das Tor nur Sie haben.

Ich habe auch das Stahlrad (wrap-around) Straights von A2345 zu 2345A, da sie auf diese Weise sortiert werden, werden.

Andere Tipps

ich die Regex für diese neu geschrieben, weil ich es frustrierend gefunden und verwirrend. Groupings macht viel mehr Sinn für diese Art von Logik. Die Sortierung erfolgt ist, um eine Standard-Array Sortiermethode in JavaScript verwendet daher die seltsamen Reihenfolge der Karten, sie sind in alphabetischer Reihenfolge. Ich habe meine in Javascript, aber die Regex könnte Java angewandt werden.

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' },
  ];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top