Найдите лучшие карты, чтобы завершить частичную покерную комбинацию - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь найти эффективное решение для следующего вопроса:

Терминология:

Ранг: 1-13, где 11 = Джек, 12 = Королева, 13 = Король

масть: H = червы, C = трефы, D = алмазы, S = пики

"WishCard": карта, которая может носить любой ранг / масть в соответствии с wi sh игрока без дубликата карты.

Имеется от 2 до 7 карт, и по крайней мере от 0 до 7 из них определены как «WishCard», какова наилучшая комбинация карт, которую игрок может иметь в указанное c время.

Examples:
Stage: Pre-Flop
Hand[4C,*] -> Hand[4C,4H] | Pair

Stage: Flop
Hand[4C,*], Shared[*,10H,5C] -> Hand[4C,10C], Shared[10D,10H,5C] | 10 Three of a kind

Stage: Turn
Hand[4C,*], Shared[*,10H,5C,1S] -> Hand[4C,1C], Shared[1D,10H,5C,1S] | Ace Three of a kind

Stage: River
Hand[4C,*], Shared[*,10H,5C,1S,6C] -> Hand[4C,8C], Shared[7C,10H,5C,1S,6C] | 4C-8C Straight Flush

Я чувствую, что грубое принуждение потребует вечности. Есть ли более быстрый способ его расчета?

1 Ответ

2 голосов
/ 25 марта 2020

Это зависит от того, что вы подразумеваете под «грубым принуждением». Но это грязно, потому что есть много возможностей и много логики c.

Я бы предварительно обработал это в структуру данных, а затем написал бы функции, которые тестируют для определенных c видов рук. Затем просто ищите каждый вид от лучшего к худшему, используя любой трюк, который приходит на ум.

Примером предварительной обработки может быть создание ха sh типа / количества карт. Например, на терне вы получаете:

{4: 1, 10: 1, 4: 1, 5: 1, 1: 1, 14: 1, "*": 2}

А теперь тот факт, что "*" появляется 2x, означает, что нам понадобится еще 2, чтобы получить 4 вида, или 1, чтобы получить 3 вида или ничего, чтобы получить 2 вида. Без анализа того, в какие именно карты превращаются эти "*". Теперь вы можете создавать тесты для 4-х типов, фулл-хаусов, 3-х типов, 2-х пар и 1-й пары.

Для стритов вы проходите последовательность, отслеживая, сколько из последних 5 карты, которые вы видели. Если вы когда-либо не дотянете до числа * s, у вас есть стрит.

Для приливов вы должны вернуть руки для каждого гриппа sh.

Для прямого гриппа sh вы бы проанализировали грипп sh рук на стриты.

А затем вам нужно просто выбрать старшие карты.

...