桥牌得分


13

使合同桥梁非常有趣的一件事是其高度复杂的“人工”元游戏。这种计分系统只是其中的一小部分。

桥牌是一个花招的纸牌游戏。每个玩家有13张手牌,游戏开始于竞标。竞标决定了其余游戏的进行方式,因此这是至关重要的部分。为了确保您和您的伴侣的出价不会太高(或太低),我们开发了这种人工评分系统来告诉您您的手牌有多好。

计分

这是一个示例手:

S:KQT5
H:J72
D:965
C:AK8

S,H,D,C代表西服(锹,心形,菱形和棍棒),其余为这些西服中的牌。因此,此手有一张黑桃皇后(Q),一张黑王(K),十张黑桃(T),五张黑桃,红心杰克,七张红心,等等。

计分系统的工作方式如下:

  • 您每获得一张王牌(A),您将获得4点;每位国王(K),您将获得3点;每位皇后(Q),您获得2点;每位杰克(J),您获得1点。没有其他卡可以得分。
  • 西装第四张之后的每张卡都会给你1分。因此,如果您有六颗心,您将获得2分。
  • 一套只有2张卡片的西装可以给你1分(这是一双)。仅有1张卡片的西服给您2分(这是单身人士)。如果您在某套西装中没有卡,则得到3分(这是无效的)。(通常,只有在您与伴侣商定了诉讼之后,才计入这些费用,但为了使挑战变得更加有趣,我将它们包括在内。)

因此,上述手有13点。

挑战

给定上面显示的格式的桥手,计算该手有多少点。西服将始终按照黑桃,心,钻石和球棒的顺序列出,并且牌将始终按A,K,Q,J,T,9-2的顺序排序。

样本输入和输出

S:KQT5
H:J72
D:965
C:AK8
       \-> 13

S:AKQT6
H:54
D:J83
C:732
       \-> 12

S:
H:KQT8754
D:A86
C:432
       \-> 15

S:9876
H:843
D:652
C:432
       \-> 0

S:AKQT5
H:AQJ6
D:Q3
C:AK
       \-> 28

这是,因此以字节为单位的最短代码获胜。

Answers:


4

果冻,27 25 21字节

感谢@Dennis提供-3个字节!

L_5.AḞW+“JQKA”i$€Sµ€S

这将输入作为行列表。要将输入作为多行字符串,请在之前添加一个前缀ṣ⁷µ

制作频率点表:

Cards:    0  1  2  3  4  5  6 ... 4+k
Points:   3  2  1  0  0  1  2 ... k

我们可以看到它们等于abs(c-3.5)-.5,其中c是纸牌数。由于每行包含两个额外的字符,并且点数始终是整数,因此floor(abs(l-5.5))这里的l是行长。

请注意,Jelly的索引是从1开始的,而且向量化函数在不匹配维度上的行为:较长列表的额外元素不受影响。所以[1] + [3,2,0,0][4,2,0,0]

                  µ      The program is two monadic fs applied in turn; an atop.
L_5.AW+“JQKA”i$€S       Helper function:
                 €        For €ach line:
L                         Get the line Length.
 _5.                      Subtract 5.5 (Numeric literals' decimal parts default to .5)
    A                     Apply Absolute value
     Ḟ                    Floor
      W                   Then Wrap it in an array. "S:AKQT6" gives [1].
        “JQKA”i$          Monadic function: index into the string "JQKA".
                €         Apply ^ over €ach char of the line; [3,2,0,0,0].
       +                  Add the two arrays together; [4,2,0,0,0].
                 S        Sum; 6.
                    S    Main link: Sum all results

在这里尝试。


3

ES6,107个 99 89字节

s=>(t=0,[...s].map(c=>t+="JQKA".search(c)+1),s.split`
`.map(l=>t+=(l=l.length-6)^l>>4),t)

2

Pyth,27 25 24字节

sms+a5.5ldshMxL"JQKA"d.z

我们分别为每个西装计算值,然后将它们相加。

  s m                 sum of map lambda d:  (d is a line of input)
      +                 add the
        s a                 floor of the absolute difference between
            5.5               5.5
            l d               and len(d)
          s hM xL           to the sum of the indices each incremented by one
                  "JQKA"      of each char in d in the string "JQKA"
                  d
      .z

测试套件


1

视网膜,77 59字节

T`AKQJTd`5-1
:(.){0,3}(.)?
$#1$#1$#2 3$0
\S
$0$*1
+`1 1

1

行/行对的说明:

  • 在第一行中,我们将char转换AKQJT9876554325432111111111。这意味着每件西装我们都有一笔款项。如果我们有0 1 2 3 4 5 6 7 ...这套西装,总和+3 +1 -1 -3 -4 -4 -4 -4 ...与正确的分数相差甚远。
  • 为了纠正这一点,在第2行和第3行中,我们在每行中加3,在空格之前添加要减去的值。此相减后的值是纸牌长度的两倍,最大为3,如果至少有4张纸牌,则为1。
  • 在第4行和第5行中,我们将数字转换为一元,除分隔符空间外,其他所有内容都将丢弃。
  • 在第6行和第7行,我们进行一元减法。
  • 在第8行中,我们对1给出了结果的进行计数。

在这里在线尝试。



1

Stax,18 个字节

½Γ}♣▓="pì∩û╨▐M↨}╚-

到目前为止,最短的答案是击败了果冻(尽管我希望很快能被击败...)

在线运行和调试!

说明

使用解压后的版本进行解释。

LZF{"JQKA"I^+i5-:++F5+
L                         Collect input in a list (if this is not needed, we can yet save another byte)
 Z                        Put a zero under the top of the stack, used as the accumulator
  F                       Loop for every suit
   {               F      Calculate the "score" for the string describing the suit
    "JQKA"I^              Find the 1-based index of current character in "JQKA", 0 for not found
            +             Add to the accumulator
             i5-:+        Subtract 5 from the current 0-based index, and take the sign
                  +       Add to the accumulator
                    5+    Add 5 extra points for each suit

这是通过翻译实现的

  • 西装第四张之后的每张卡都会给你1分。因此,如果您有六颗心,您将获得2分。
  • 一套只有2张卡片的西装可以给你1分(这是一双)。仅有1张卡片的西服给您2分(这是单身人士)。如果您在某套西装中没有卡,则得到3分(这是无效的)。

  • 每套西装得3分
  • 西装中第四张之前的每张牌给你-1分,第四张之后的每一张牌给你1分,第四张得0分。

然后,我们可以利用signum函数的属性。

通过这样做,我们可以避免显式处理数量少的卡。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.