Regex для расчета прямой покер рукой?
Вопрос
Есть ли регельс для расчета прямой покерной руки?
Я использую строки, чтобы представлять отсортированные карты, как:
AAAAK#sssss = 4 aces and a king, all of spades.
A2345#ddddd = straight flush, all of diamonds.
В Java я использую эти 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}");
Как рассчитать прямые (последовательности) значения с регулярным выражением?
РЕДАКТИРОВАТЬ
Я открываю еще один вопрос, чтобы решить одну и ту же проблему, но с использованием значения ASCII CHAR, чтобы регулировать коротким. Подробности здесь.
Спасибо!
Решение
Я должен признать, что регулярные выражения не первый инструмент, о котором я бы подумал об этом. Я могу в значительной степени гарантировать, что любой Re, способный сделать это с неблагоприятной рукой, будет гораздо более отвратительным и гораздо менее читабельным, чем эквивалентный процессуальный код.
Предполагая, что карты отсортированы по значению лица (и они, кажется, в противном случае ваши перечисленные Regexes тоже не будут работать), а вы должен Используйте Regex, вы мог Используйте постройку, как
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
Так как они будут отсортированы таким образом.
Другие советы
Я переписал 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' },
];