Pull to refresh

Comments 6

я тоже перебрал все возможные комбинации в техаском холдеме) только вы математически доказали в чем я полный ноль))) , а я через код это все сделал, все верно для 7 карт именно столько комбинаций, в моей бд postgresql это заняло 1 Гб + сделал расклад с названием руки все из 7 карт, при этом выделяя 5 карточную лучшую из 7 карт и рангом для сравнения рук у каждого игрока, тут ссылку на видео думаю нельзя оставлять поэтому так! просто тоже нравится техасский холдем и только поэтому начал програмировать и как то затянуло все)

Эту проблему решают давно и упорно, вот посмотрите один из обзоров готовых решений: https://www.codingthewheel.com/archives/poker-hand-evaluator-roundup/

P.S.:

Так как 4 одинаковые карты всегда будут давать один блок, который даст остаток 0 (число 15, все 4 бита заполнены) и одну карту, которая не входит в этот диапазон

вы решили задачу только для 5-карточного евала, а например для самого популярного техасского холдема нужен 7-карточный евал

Задача решалась именно для техасского холдема, в тексте же указано:
Оно определено для 5-ти карточного покера, но мы же с вами уже знаем комбинаторику. Давайте прикинем. Если нам не важен порядок, то число комбинаций из 5-ти карт, если общее число карт равно 7 будет:

мы попросту перебираем двадцать одну 5-карточную комбинацию из 7 доступных карт, и исполняем алгоритм для каждой комбинации. Потом оставляем себе лучшую из 21 комбинаций.

в целом, интересно видеть решение данной задачи «в домашних условиях»

Ага. Задача решена для техасского холдема через перебор вариантов. Я согласен, что это не совсем "честно". Просто учитывая принцип алгоритма и его число операций в той же омахе ну будет в несколько раз больше вариантов. Определение всё равно займёт несущественно времени. Перевести к нужному виду ничего не стоит, и дальше цикл по 5-ти элементам дважды на 5-ти картах. Решение с mod приводит элегантно к такой скорости одного перебора, что нет смысла это особо оптимизировать даже. Это операция которая вызывается не каждый кадр рендера, а по событию смены состояния.

Я изначально изучая тему думал зайти через матрицы. То есть взять построить матрицу 4 х 13 и поискать какие-то зависимости по определителям, особенно если матрицу приводить к верхнетреугольному виду. Но разобрав этот алгоритм решил, что через матрицы будет не особо то и быстрее. Один проход на 7 картах вместо того чтобы 21 раз перебрать комбинации из 5-ти карт. Но проход этот очень сложный. Так как стритфлеш - 5 карт подряд в строке. Флеш просто 5 карт в строке. Стрит 5 карт подряд в разных столбцах, но не в одной строке. Пары и фуллхаузы определяются примерно так же по столбцам. И у меня была гипотеза что можно двигать каретку с памятью, и дальше получать определение комбинации по "нашёл сильнее". Но я для такого не придумал элегантный обход. Хотя думаю, что в целом он должен быть. Просто паттерны перебирать это явно долго. Так как худшее время это 4 * 13 * 8 = 416 (восемь - это комбинации кроме флеш рояла и старшей руки). Хотя вообще может текущий обход в 21 раз будет чуть помедленнее плюс докинем туда её выбор самих комбинаций из 5-ти карт. Но тут нет драматического выигрыша. А текущей производительности даже для калькулятора в современном мире хватит.

Если вдруг додумаю и придумаю элегантное решение на матрицах - и про него напишу.

Если не лень, попробуйте побенчмаркать против других готовых решений ))

Sign up to leave a comment.

Articles