Regex для расчета прямой покерной руки? - PullRequest
5 голосов
/ 12 августа 2010

Существует ли регулярное выражение для расчета прямой покерной руки?

Я использую строки для представления отсортированных карт, например:

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

Как вычислить прямые (последовательности) значения с регулярным выражением?

РЕДАКТИРОВАТЬ

Я открываю еще один вопросчтобы решить ту же проблему, но используя ascii значение char, регулярное выражение будет коротким.Подробности здесь .

Спасибо!

Ответы [ 2 ]

5 голосов
/ 12 августа 2010

Я должен признать, что регулярные выражения - не первый инструмент, о котором я бы подумал для этого. Я могу в значительной степени гарантировать, что любой RE, способный сделать это с несортированной рукой, будет гораздо более отвратительным и намного менее читаемым, чем эквивалентный процедурный код.

Если предположить, что карты отсортированы по номиналу (и они, по-видимому, в противном случае перечисленные вами регулярные выражения также не будут работать), и вы должны использовать регулярное выражение, можете использовать конструкция типа

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)

По сути, они такие же, как у вас, за исключением того, что я добавил флеш-рояль / стрит-флеш и стрит. При условии, что вы проверяете их по порядку, вы должны получить лучший результат с руки. Для старшей карты нет регулярных выражений, так как на данный момент это единственный счет, который вы можете получить.

Я также изменил прямолинейность стальных колес с A2345 на 2345A, так как они будут отсортированы таким образом.

0 голосов
/ 30 мая 2018

Я переписал регулярное выражение для этого, потому что я нашел его расстраивающим и запутывающим.Группировки имеют гораздо больше смысла для этого типа логики.Сортировка выполняется с использованием стандартного метода сортировки массива в 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' },
  ];
...