Поиск стрита в криббидже - PullRequest
1 голос
/ 13 июля 2020

Предпосылки

Для тех из вас, кто не знаком с Криббиджем, он использует стандартную колоду из 52 карт, а тузов всегда мало. Рука игрока состоит из 4 карт, и есть одна карта хода, которую все игроки могут использовать, чтобы подсчитать свою руку.

Итак, для небольшой тренировки для себя я написал немного VBA и получил все ~ 12,9 миллиона возможных комбинаций очков, напечатанных на листе Excel. Я присвоил каждой карте целое число от 1 до 52 и настроил его так, чтобы каждая масть представляла собой последовательный блок из 13 карт. 1-13 = трефы, 14-26 = бубны, 27-39 = червы и 40-52 = пики. Я сдал каждую карту в отдельную ячейку в соседних столбцах. Ie B1:E1 - рука, F1 - ход. Рука (B1: E1) также организована таким образом, что наименьший идентификационный номер карты (не номинал карты) находится слева, а высший - справа.

Затем я начал возиться с тем, как подсчитать любую данную руку с использованием формул Excel. До сих пор я мог проверить наличие 4- и 5-карточного гриппа sh (флеш = все карты одной масти), пар (включая тройку и четверку), 15 комбинаций (2,3,4 и 5 карт. ). Что у меня выдающееся, так это проверка на стриты и 1 очко за ручку (валет в руке соответствует масти поворота). Проверить последнее должно быть достаточно просто.

Стрит в Криббидже - это самая большая последовательность / серия карт. Вы не можете go круглосуточно, (ie 3,2,1,13,12 или 3,2, A, K, Q). Вы не можете сосчитать две стрита с 4 картами из 5 стритов, так как учитывается только самая большая. Однако вы можете считать дабл-стрит, например, 2,2,3,4,5 или 2,3,4,4,5. Каждая карта в стрите засчитывается как 1 очко.

Задача

Я не уверен, как определить стрит с четырьмя картами, когда есть дабл / пара одной из карт. эй. 2,3,4,5,16 или 2,3,4,5,15 или 2,3,4,5,18. (Номинал: 2,3,3,4,5 или 2,2,3,4,5 или 2,3,4,5,5)

Что я пробовал до сих пор

Я смог достаточно легко вычислить 5 карт, используя: MOD, чтобы преобразовать карты в номинал и снять масть, AGGREGATE, чтобы отсортировать карты, а затем проверить, была ли каждая карта подходящим отличием от первой карты. Формула немного громоздка, но работает:

=AND(
AGGREGATE(15,6,MOD(B1:F1,13),2)-AGGREGATE(15,6,MOD(B1:F1,13),1)=1,
AGGREGATE(15,6,MOD(B1:F1,13),3)-AGGREGATE(15,6,MOD(B1:F1,13),1)=2,
AGGREGATE(15,6,MOD(B1:F1,13),4)-AGGREGATE(15,6,MOD(B1:F1,13),1)=3,
AGGREGATE(15,6,MOD(B1:F1,13),5)-AGGREGATE(15,6,MOD(B1:F1,13),1)=4
)*5

Итак, я начал с последовательности из 4 карт. Я могу заставить его работать, если это не двойной прямой.

=OR(AND(AGGREGATE(15,6,MOD(B1:F1,13),2)-AGGREGATE(15,6,MOD(B1:F1,13),1)=1,
AGGREGATE(15,6,MOD(B1:F1,13),3)-AGGREGATE(15,6,MOD(B1:F1,13),1)=2,
AGGREGATE(15,6,MOD(B1:F1,13),4)-AGGREGATE(15,6,MOD(B1:F1,13),1)=3,
AGGREGATE(15,6,MOD(B1:F1,13),5)-AGGREGATE(15,6,MOD(B1:F1,13),1)<>4),
AND(AGGREGATE(14,6,MOD(B1:F1,13),2)-AGGREGATE(14,6,MOD(B1:F1,13),1)=-1,
AGGREGATE(14,6,MOD(B1:F1,13),3)-AGGREGATE(14,6,MOD(B1:F1,13),1)=-2,
AGGREGATE(14,6,MOD(B1:F1,13),4)-AGGREGATE(14,6,MOD(B1:F1,13),1)=-3,
AGGREGATE(14,6,MOD(B1:F1,13),5)-AGGREGATE(14,6,MOD(B1:F1,13),1)<>-4))
*4

Или разбить его на отдельные проверки.

=AND(
AGGREGATE(15,6,MOD(B1:F1,13),2)-AGGREGATE(15,6,MOD(B1:F1,13),1)=1,
AGGREGATE(15,6,MOD(B1:F1,13),3)-AGGREGATE(15,6,MOD(B1:F1,13),1)=2,
AGGREGATE(15,6,MOD(B1:F1,13),4)-AGGREGATE(15,6,MOD(B1:F1,13),1)=3,
AGGREGATE(15,6,MOD(B1:F1,13),5)-AGGREGATE(15,6,MOD(B1:F1,13),1)<>4
)*4

AND(
AGGREGATE(14,6,MOD(B1:F1,13),2)-AGGREGATE(14,6,MOD(B1:F1,13),1)=-1,
AGGREGATE(14,6,MOD(B1:F1,13),3)-AGGREGATE(14,6,MOD(B1:F1,13),1)=-2,
AGGREGATE(14,6,MOD(B1:F1,13),4)-AGGREGATE(14,6,MOD(B1:F1,13),1)=-3,
AGGREGATE(14,6,MOD(B1:F1,13),5)-AGGREGATE(14,6,MOD(B1:F1,13),1)<>-4
)*4

Вопрос

Как найти стрит из четырех карт с дабл / паром, используя формулы Excel, желательно в конечном итоге в одной ячейке. Я не возражаю против использования нескольких ячеек для построения и понимания формулы.

Есть ли лучший способ идентифицировать стрит, используя формулы Excel?

Я надеюсь развить концепцию стрита с 4 картами , когда выяснилось, чтобы следить за 3 стритами карт.

Образец данных

| B | C | D | E | F  |
+---+---+---+---+----+
| 2 | 3 | 4 | 5 | 14 |   <= 5 card straight
| 2 | 3 | 4 | 5 | 16 |   <= 2 X 4 card straight
| 2 | 3 | 4 | 5 | 15 |   <= 2 X 4 card straight
| 2 | 3 | 4 | 5 | 18 |   <= 2 X 4 card straight
| 2 | 3 | 4 | 20| 5  |   <= 1 X 4 card straight
| 2 | 3 | 4 | 8 | 10 |   <= Not a straight

Версия Excel

Я использую Excel 2013

1 Ответ

4 голосов
/ 13 июля 2020

Мы можем использовать СУММПРОИЗВ с АГРЕГАТОМ:

=IF(SUMPRODUCT(--(AGGREGATE(14,7,MOD(B1:F1-1,13)+1,{1,2,3,4})-AGGREGATE(14,7,MOD(B1:F1-1,13)+1,{2,3,4,5})=1))=4,"5 card straight",
 IF(AND(SUMPRODUCT(--(AGGREGATE(14,7,MOD(B1:F1-1,13)+1,{1,2,3,4})-AGGREGATE(14,7,MOD(B1:F1-1,13)+1,{2,3,4,5})=1))=3,AGGREGATE(14,7,MOD(B1:F1-1,13)+1,1)-AGGREGATE(15,7,MOD(B1:F1-1,13)+1,1)=3),"2 X 4 card straight",
IF(AND(SUMPRODUCT(--(AGGREGATE(14,7,MOD(B1:F1-1,13)+1,{1,2,3,4})-AGGREGATE(14,7,MOD(B1:F1-1,13)+1,{2,3,4,5})=1))=3,OR(AGGREGATE(14,7,MOD(B1:F1-1,13)+1,2)-AGGREGATE(15,7,MOD(B1:F1-1,13)+1,1)=3,AGGREGATE(14,7,MOD(B1:F1-1,13)+1,1)-AGGREGATE(15,7,MOD(B1:F1-1,13)+1,2)=3)),"1 X 4 card straight","Not a Straight")))

введите описание изображения здесь

...