谁赢得黑桃把戏


19

编写代码以确定谁在黑桃游戏中赢得四张牌。最少的字节数获胜。

输入是一个字符串,其中列出了依次播放的四张牌,例如TH QC JH 2H(红心十张,俱乐部皇后,红心杰克,两张红心)。卡片由两个字符组成:的西装CDHS和的值23456789TJQKA。您可以确保输入有效,并且卡片是不同的。

您应该为该技巧的赢家输出1、2、3或4。在此示例中TH QC JH 2H,红心大佬将赢得胜利,因此您应输出3。

您的输入和输出必须完全与描述的相同,除了结尾的换行符是可选的。

这是黑桃赢得比赛的规则。获奖卡片是四张卡片中最高的一张,但有一些警告。黑桃是王牌,因此任何黑桃都比任何非黑桃都重要。第一张打出的牌是打牌,只有该套牌或黑桃的牌才有资格赢球。比较相同花色的卡的值,并按升序给出23456789TJQKA

测试用例:

TH QC JH 2H
3
KC 5S QS 9C
3
QD 2D TD 5D
1
9S 5D AD QS
4
3D 4C 3H JH
1
9S 4S TS JS
4
5H 9H 2C AD
2
5S 4C 3H QD
1
2H 2S KH AH
2

Answers:


10

Pyth,28 27 25字节

J"KTAZ"hxcz)eo_XN+@z1JJcz

在线尝试:演示测试套件(前4个字符是测试套件的结构)

感谢@isaacg提供了一个技巧,它节省了2个字符。

主要思想是以这种方式修改每只手的字符,以使获胜手具有最大值。

手的值23456789TJQKA已经差不多排序了。我只是需要更换TAKTA具有Z与导致23456789AJQSZ

CDHS最重要的是西装的顺序。S,最有力的西装,已经是最大值。重要的是让第一手诉讼具有第二强大的价值。所以我把这件衣服翻译成K

还必须将所有指针反向读取,因为西服比价值更强大。

                           implicit: z = input string
J"KTAZ"                    J = "KTAZ"
             o         cz  orders the hands N of split(z) by:
              _              the reversed of 
               XN+@z1JJ      N, where the values z[1]+J are replaced by J
            e              last element (winning hand)
        xcz)               index of the winning hand in split(z)
       h                   + 1

我放弃了,发挥不错:P
orlp 2015年

我认为这些.e内容不值得- 我认为使用o的字符数要短1个字符。
isaacg 2015年

@isaacg您的权利。有趣的是,我有.e28个解决方案之前的27个解决方案。但是27个解决方案以a结尾,)因此也有28个字节。:oops:
Jakube

1
我想到了一种方法来保存另外2个字符:从转换+@z1"KTA""KTAZ",但不是直接使用J"KTAZ"开头和+@z1Jto 处的字符串J
isaacg 2015年

@isaacg非常聪明。谢谢。顺便说一句。我花了相当长的时间考虑使第3个参数成为X可选参数(仅当a和b是字符串时)。但是我不太确定,是否Xab)应该评估为Xab_b(倒置b,对于类似的东西Xa"</\>")或Xab+tbhb(b移位)会更好。您的偏好是什么?
2015年

6

CJam,34 33字节

lS/_{)2$0='S+\#\"TQKA"_$er+}$W>#)

算法

逻辑很简单。我正在进行一个自定义排序,在该排序中,我首先将代表西装的第二个字符优先。在这种情况下,黑桃获得最高优先级,然后是第一个抛出的套件。其余的都是-1。然后,我通过TA和交换来对第一个字符进行排序QK以进行词汇排序。

代码说明

首先,让我们看看卡片的面值的词汇顺序是什么:

"23456789TJQKA"$

23456789AJKQT

因此,所有数字都位于正确的位置。J也处于正确位置。我们需要交换Kand QJand A以获得词汇顺序。

lS/_{)2$0='S+\#\"TQKA"_$er+}$W>#)
lS/                                 "Read an input line and split on spaces";
   _{                      }$       "Copy the array and sort it using this custom logic";
     )                              "Take off the last character of each hand.";
      2$0=                          "Get the suit of the first hand";
          'S+                       "Add Spades suit to it";
             \#                     "Get the index of the current hand suit.
                                     1 for Spades, 0 for first hand suit, -1 otherwise";
               \                    "Put face value of this hand on top of stack";
                "TQKA"              "Put string TQKA on stack";
                      _$            "Copy and sort. This essentially reverses the string
                                     TQKA to form AKQT. This is 1 byte shorter than _W%";
                        er+         "Swap T with A and K with Q and add to the
                                     suit index calculated previously";
                                    "After the above tuple, sorting will automatically
                                     convert the tuple to string and sort lexically";
                             W>     "Get the array containing only the last element";
                               #)   "Get the index of this hand in original set and
                                     increment to convert it to 1 based";

在这里在线尝试


3

JavaScript(ES6),112

扫描列表并返回找到的最大值的位置。

运行代码片段进行测试(在Firefox中)

F=t=>t.split(' ').map((c,i)=>(n='23456789TJQKA'.search(c[0])+(c[1]>'H'?40:c[1]==t[1]&&20))>m&&(m=n,r=i+1),m=0)|r

C.innerHTML=['TH QC JH 2H','KC 5S QS 9C','QD 2D TD 5D','9S 5D AD QS','3D 4C 3H JH','9S 4S TS JS','5H 9H 2C AD','5S 4C 3H QD'].map(h=>h+' -> '+F(h)).join('\n')
<pre id=C></pre>


3

Perl,73个字节

#!perl -pl
/\B./;s/$&/P/g;y/TKA/IRT/;$_=reverse;@a=sort split;/$a[-1]/;$_=4-"@-"/3

试试

转换纸牌名称,使游戏价值顺序遵循字母顺序,然后通过排序选择最高的并在原始字符串中寻找位置。


2

Ruby,59 + 2 = 61

使用命令行标志na,运行

p (1..4).max_by{|i|$F[i-1].tr($_[1]+'SJQKA','a-z').reverse}

2

J,47个字节

1+[:(i.>./)_3+/\16!@-]i.~'SXAKQJT9876543'1}~1&{

用法:

   (1+[:(i.>./)_3+/\16!@-]i.~'SXAKQJT9876543'1}~1&{) 'TH QC 9S 8S'
3

方法:

  • 对于每个输入字符,我们根据其在'S[second char of input]AKQJT9876543'字符串中的位置分配一个值。未找到的字符last position + 1隐式获取值。其他字符的值(value=(16-position)!)少得多。
  • 计算三个输入字符三元组和一个二元组(例如TH_ QC_ 9S_8S)的总和。
  • 选择从1开始的最大值索引。

(不幸的是,J无法直接比较字符或字符串。它只能检查它们的相等性,这排除了解决此挑战的其他方法。)

在这里在线尝试。


2

C#,237

using System;namespace S{class P{static void Main(string[] a){var V="23456789TJQKA";int x=0;int y=0;var z=a[0][1];for(int i=0;i<4;i++){int q=V.IndexOf(a[i][0])+2;var w=a[i][1];q*=w==z?1:w=='S'?9:0;if(q>y){x=i;y=q;}}Console.Write(x+1);}}}

工作原理:迭代每只手以计算卡的“值”。存储最高价值的索引。卡值确定为卡的等级乘以0(如果不是黑桃或开幕服),1(如果是黑桃)和9(如果不是黑桃但不是开幕服)。(9选择的b / c 2 * 9 = 18> A = 14&9是单个字符)


1

Pyth,36 33字节

KczdhxKeo,x,ehK\SeNXhN"TKA""AYZ"K

相当简单的方法,使用带有自定义键函数的排序,然后找到最高值的索引。


您是否尝试过避免排序,而只是找到最高价值?在JavaScript中,结果变得更短
edc65

@ edc65在Pyth中,没有操作可以找到最大值,而只是进行排序。但是使用一个字符(e),您可以获得最后一个元素,因此,找到最高值只是在排序之后才获得最后一个元素。
orlp 2015年

唐纳德,关心解释吗?
orlp 2015年

1

Pyth,31个字节

hxczdeo}\SNo}@z1Zox"TJQKA"hNScz

在这里尝试。

怎么运行的:

阅读此过程的正确方法是从头到尾。该过程将所需的卡排序到列表的末尾,然后将其拉出并在原始列表中找到其索引。

  • cz:这将生成卡串列表。c,chop通常是一个二进制函数(arity 2),但是当仅在一个输入上调用时,它用作.split()字符串方法。

  • S:这将应用正常的排序行为,即对编号较低的卡片优先于编号较高的卡片进行排序。

  • ox"TJQKA"hN:这将按卡片首字母(x)字符串"TJQKA"中的索引()对卡片进行排序hN。对于带有数字的卡,找不到第一个字母,给出结果-1。由于Pyth的排序功能稳定,因此编号卡的顺序不受影响。

  • o}@z1Z:接下来,我们根据所涉及的第一张牌中的第一张牌(@z1)的顺序进行排序。由于True排序在后面False,因此将主服的卡片发送到后面。

  • o}\SN:与之前的排序相同,但是S根据卡片中是否包含字母进行排序,并向后发送黑桃。

  • hxczde:这将提取以此方式排序的最后一张纸牌(e),在纸牌列表中找到其索引(xczd),然后递增1(h),以提供所需的玩家位置。

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.