質問

ストレートポーカーハンドを計算する正規表現はありますか?

並べ替えられたカードを表すために文字列を使用しています。

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

Javaでは、これらの正規表現を使用しています:

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

Regexでストレート(シーケンス)値を計算する方法は?

編集

同じ問題を解決するために別の質問を開きますが、charのASCII値を使用して、正規表現を短くします。詳細 ここ.

ありがとう!

役に立ちましたか?

解決

正規表現は、これを行うために考えた最初のツールではないことを認めなければなりません。私は、それを非難の手に行うことができることが、同等の手続きコードよりもはるかに恐ろしく、はるかに読みやすくなることを保証することができます。

カードが額面でソートされていると仮定すると(そして、それ以外の場合はあなたのリストされている修復も機能しないようです)、そしてあなたは しなければならない 正規表現を使用してください たぶん......だろう 次のようなコンストラクトを使用します

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

手の額面部分を検出します。

実際、私が集めたものから ここ 「標準」の手のうち、優先度を減らす順に以下を確認する必要があります。

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)

基本的に、それらはあなたと同じです。私がロイヤル/ストレートフラッシュとストレートを追加したことを除いて。それらを順番にチェックすると、手から最高のスコアを取得する必要があります。ハイカードには正規表現はありません。その時点で、それがあなたが持つことができる唯一のスコアだからです。

また、スチールホイール(ラップアラウンド)をからまっすぐに変更しました A23452345A 彼らはそのように整理されるので。

他のヒント

私はそれがイライラして混乱していることがわかったので、私はこのためにREGEXを書き直しました。グループ化は、このタイプのロジックについてはるかに理にかなっています。ソートは、JavaScriptの標準配列ソートメソッドを使用して行われているため、カードの奇妙な順序で、アルファベット順にあります。私はJavaScriptで私のものをしましたが、正規表現は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' },
  ];
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top