- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景
对于那些不熟悉 Cribbage 的人,它使用标准的 52 张牌,A 总是低的。玩家的手牌由 4 张牌组成,并且有 1 张转牌可供所有玩家使用以帮助得分。
因此,对于我自己的一个小练习题,我写了一个 VBA 文件,并在 Excel 表中打印了大约 1290 万个可能的得分组合。我为每张牌分配了一个 1 到 52 的整数,并将其设置为每套花色是 13 张牌的连续 block 。 1-13 = 梅花,14-26 = 方 block ,27-39 = 红心,40-52 = 黑桃。我将每张卡片放入相邻列中自己单独的单元格中。即B1:E1
是手和F1
轮到了。手牌 (B1:E1) 也组织在最低的卡 ID 号(不是卡值)在左侧,最高在右侧。
然后我开始修改如何使用 excel 公式为任何给定的手打分。到目前为止,我已经能够检查 4 和 5 牌同花(同花 = 所有牌同花色)、对子(包括三种和四种同花)、15 种组合(2、3、4 和 5 张牌)。我最擅长的是检查直道和旋钮的 1 点(手中的 jack 与转牌相匹配)。检查后者应该很容易。
Cribbage 中的顺子是最大的牌序列/系列。您不能全天候(即 3,2,1,13,12 或 3,2,A,K,Q)。您不能计算 5 张顺子中的两个 4 张顺子,因为只计算最大的顺子。但是,您可以计算双顺子,例如 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 or 2,2,3,4,5 or 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
问题
| 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版
最佳答案
我们可以将 SUMPRODUCT 与 AGGREGATE 一起使用:
=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")))
关于excel - 在纸条上找一条直线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62880243/
我是一名优秀的程序员,十分优秀!