这是同花顺吗?


21

相关:命名扑克手

同花顺是一张包含五张相继排名的扑克牌,全部相同。作为同花顺的一部分,王牌可以排名高于国王或低于两位。一张高手可以排在高位(例如A♥K♥Q♥J♥10♥是高位同花顺)或低(例如5♦4♦3♦2♦A♦是五高同花顺),但是不能同时在高手和低手同时排名(例如Q♣K♣A♣2♣3♣是高手同花,而不是同花顺)。

挑战

N如果扑克手中有同花顺,给定的纸牌(以任何合理的格式)将输出真实值。

输入项

  • N卡数。(以任何合理的格式)

一共有四套西装。心,黑桃,钻石和球棒(H, S, D, C)

每套西装都有一张2到10的卡片,外加4张“图片”卡片,分别是Ace,Jack,Queen和King (A, J, Q, K)

注意:您可以将10作为T

输出量

  • Truthy/Falsy

测试用例

["AS", "2S", "3S", "4S", "5S"] => true

["3D", "9C", "4S", "KH", "AD", "AC"] => false

["5D", "6D", "7D", "8H", "9D", "10D", "JD"] => false

["JC", "7C", "5D", "8C", "AC", "10C", "9C", "5S"] =>true

[] => false

["AS", "2S", "3S"] => false

["JC", "QC", "KC", "AC", "2C"] => false

[ "2H", "3H", "4H", "5H", "6H", "7H"] => true

适用标准规则。

获胜标准:每个语言中最短的代码


1
我们可以假设手中不会有两张相同的牌吗?
Jo King

@JoKing是的,您将没有两次或多次使用同一张卡片
Luis felipe De jesus Munoz

4
我们可以10当作T吗?
凯文·克鲁伊森

@JoKing我认为这不会发生IRL。;-)
暴民埃里克(Erik the Outgolfer)

4
@EriktheOutgolfer实际上,我离我不到一米的距离大约有五包混合卡
Jo King

Answers:


15

Python 2,95个字节

lambda a:any(set('A234567891JQKA'[i/4:][:5])<={r['HCSD'[i%4]in r]for r in a}for i in range(40))

在线尝试!

有40种可能的同花顺,这仅检查了全部。Chas Brown保存了2个字节;Jo King又保存了4个。


1
有40个,你用A两端所以我相信改变3640应该修复它。
乔纳森·艾伦,

糟糕,我不擅长数数。我修好了它!
林恩


交换西服值顺序并将if条件移至索引?
Jo King


8

R128126 94 91字节

function(x,r=rle(outer(y<-chartr("J-X","A2-9TJQKAS",LETTERS),y,paste0)%in%x))any(r$l>4&r$v)

在线尝试!

@ J.Doe大大缩短了原始逻辑。

制作一个26 x 26的矩阵,其中大部分都是废话,但第3、4、8和24列的10至23行中包含的所有卡(A重复在底部)。字母J到X的字母,通过替换为A,2-9,T,J,Q,K,A,S chartr。我们免费获得C,D,H!

%in%矩阵按列展平为向量。然后查看所有TRUE匹配项的游程长度编码是否大于4 。


巧妙使用rleAND outer这将节省两个字节
JayCe

94个字节。 两项更改:使用outer产生许多无效卡的对称调用,以及使用向量向量in规避规避apply。他们俩都必须到位,才能正常工作!
J.Doe '18

2
非常好!更改了答案,并使其成为社区Wiki。
ngm

5

JavaScript(ES6),116个字节

a=>[...'CDHS'].some(s=>a.map(c=>m|=c.match(s)&&2<<"234567891JQKA".search(c[0]),m=0)|(g=k=>k&&1+g(k&k/2))(m|m>>13)>4)

在线尝试!

怎么样?

sCs


5
我已经习惯了您的“ currying notation”入门行,以至于在不需要时会错过它。
ngm

4

Brachylog,31个字节

tᵍkᵐ²cᵐ{ps₅~s"A23456789TJQKA"}ᵉ

在线尝试!

 ᵍ                    Group input by
t                     each element's "tail" (i.e. suit)
kᵐ²                   Knife off the suit character from each element in each array
cᵐ                    Concatenate the elements of each suit array into a string
{               }ᵉ    There exists at least one string in that such that
 p                    it has a permutation
 s₅                   which has a substring of length 5
 ~s                   which is also a substring of
 "A23456789JQKA"

3

视网膜0.8.2,66字节

J
11
Q
12
K
13
A
1$%'¶14
\d+(.)
$1$&$*
O`
^
¶
((?(1)\1.|¶.+)){5}\b

在线尝试!说明:

J
11
Q
12
K
13

将图片卡转换为其值。

A
1$%'¶14

A 可以是1或14。

\d+(.)
$1$&$*
O`

将值转换为一元并加后缀,以便卡正确排序。

^
¶
((?(1)\1.|¶.+)){5}\b

匹配5张每次增加1的牌,并确保最后一次增加恰好是1。


2

JavaScript(ES6),106个字节

h=>h.map(([r,s])=>[..."HSDCA23456789TJQKA"].map(c=>i+=c==s?i*15:c==r?d[i]=1:1,i=0),d=[])|/(,1){5}/.test(d)

接受的卡字符串表示,更换的数组10T在线尝试!

说明

迭代每张卡,并使用根据其等级和西服的唯一组合计算出的索引在布尔数组中设置标志。然后将此数组加字符串以允许匹配5个连续真实值的模式。

例如,具有同花顺的手可能会产生以下内容作为布尔数组的完整字符串表示的子字符串: ,,,,1,1,1,1,1,,,,

由于第一个等级值(即A)从字符串的开头偏移,因此1在数组中的all之前总会有空值,从而确保字符串表示形式以a开头,

h =>
    h.map(([r, s]) =>                         // destructure card value, e.g. "JH" => ["J", "H"]
        [..."HSDCA23456789TJQKA"].map(c =>    // mapping accounts for both positions of 'A'
            i +=                              // increment index value
            c == s                            // if found index of suit...
                ? i * 15                      // buffer so that cards from different suits cannot be confused
            : c == r                          // if found index of rank...
                ? d[i] = 1                    // set flag to denote card is in hand
            : 1,
            i = 0
        ),
        d = []
    ) |
    /(,1){5}/.test(d)                         // implicitly converts to string joined with a ,

2
真好 这应该获得更多的选票,但是在最初发布后的几天里,人们往往对挑战失去兴趣。
里克·希区柯克

2

爪哇10,189个 167 165 164 160 157 156字节

s->{int i=10;for(;i-->0;)i=s.matches("AKQJT98765432A".substring(i,i+5).replaceAll(".","(?=.*$0\\\\1)").replaceFirst(".1","([HSDC])")+".*")?-2:i;return-1>i;}

将输入作为单个以空格分隔的String(即"AS 2S 3S 4S 5S")。

-22个字节,感谢@OlivierGrégoire
-1个字节感谢@AlexRacer

在线尝试。

的Golfed版本的代码,我使用项目欧拉#54,我主要是与正则表达式做(的乐趣和更多地了解正则表达式)。如果没有正则表达式,则性能可能会更好,更容易(可能也适用于打高尔夫球的答案;稍后再看)。

说明:

s->{                    // Method with String parameter and boolean return-type
  int i=10;for(;i-->0;) //  Loop `i` in the range (10,0]:
    i=s.matches(        //   If the input matches the following regex:
        "AKQJT98765432A".substring(i,i+5)
                        .replaceAll(".","(?=.*$0\\\\1)")
                        .replaceFirst(".1","([HSDC])")
                        //    Five adjacent cards
        +".*")?         //    With optionally zero or more other characters
         -2             //     Set `i` to -2, which also stops the loops at the same time
      :i;               //   Else: leave `i` unchanged to continue
  return-1>i;}          //  Return whether `i` is not -2 (so whether the loop has finished)

其他正则表达式说明:

  • "AKQJT98765432A".substring(i,i+5) 取五张相邻的纸牌 i
  • .replaceAll(".","(?=.*$0\\\\1)")"(?=.*c\\1)"(将其中c的卡片字符替换为)这些卡片中的每张卡片
  • .replaceFirst(".1","([HSDC])")然后将替换第一个\\1([HSDC])

即,用于检查同花顺值范围内的牌的总正则表达式[9,5]将变为:(
^(?=.*9([HSDC]))(?=.*8\\1)(?=.*7\\1)(?=.*6\\1)(?=.*5\\1).*$
注意:String#matches隐式添加尾随/前导^...$以检查整个字符串。)此正则表达式将:

^(?=.*9([HSDC]))(?=.*8\\1)(?=.*7\\1)(?=.*6\\1)(?=.*5\\1).*$
^                                                         $ Match the entire string
 (?=           )(?=      )(?=      )(?=      )(?=      )    Do positive lookaheads to check
                                                            each card
    .*             .*        .*        .*        .*         With optional leading characters
                                                            in front of every card
                                                        .*  And any trailing characters at
                                                            the end of the entire hand
      9              8         7         6         5        The five adjacent values
        [HSDC]                                              With a suit
       (      )       \\1       \\1       \\1       \\1     which is the same for all cards

1
172个字节。我只打高尔夫正则表达式:它仍然是您的算法。
奥利维尔·格雷戈尔

1
167个字节。我删除了不必要的".*"+前缀。
奥利维尔·格雷戈尔

1
@OlivierGrégoire谢谢!不错的高尔夫。
凯文·克鲁伊森

1
-1个字节,如果您不使用循环而使用循环f
AlexRacer

1
@AlexRacer Smart,谢谢!通过使用方法将breakto i=-2和return 更改为高尔夫,可以再打2个字节return-1>i;(和(.)to .$1to则再更改2个$0)。:)
Kevin Cruijssen

1

干净145个 135字节

import StdEnv,Data.List
?l=or[isInfixOf(map hd h)['A234567891JQKA']\\a<-l,b<-l,c<-l,d<-l,e<-l,h<-[[a,b,c,d,e]]|tl(nub(map last h))==[]]

在线尝试!

简化:

? l                                             // function ? taking argument l
  = or [                                        // is at least one of these true
        isInfixOf (map hd h) ['A234567891JQKA'] // do the first characters of a hand appear in this string, in order
        \\ a <- l                               // loop level 1, assigns `a`
           , b <- l                             // loop level 2, assigns `b`
             , c <- l                           // loop level 3, assigns `c`
               , d <- l                         // loop level 4, assigns `d`
                 , e <- l                       // loop level 5, assigns `e`
                   , h <- [[a,b,c,d,e]]         // trick to assign `h`, because it's cheaper than let .. in ..
        | tl (nub (map last h)) == []           // only take the loop iterations where all the suits are the same
       ]

1

Japt,37个字节

将输入作为2D数组。

"AJQKA"i1Aò2 q)øUñÌòÏ̦XÌÃËmάú5 á5Ãc

试试吧


说明

"AJQKA"                                   :String literal
       i1                                 :Insert at (0-based) index 1
         Aò2                              :  Range [2,10]
             q                            :  Join
              )                           :End insert
               ø                          :Does that string contain any element in the following array?
                U                         :Input
                 ñ                        :Sort
                  Ì                       : By last element (grouping suits together)
                   òÏ                     :Partition between X & Y where
                     Ì                    :  Last element of Y
                      ¦                   :  Does not equal
                       XÌ                 :  Last element of X
                         Ã                :End partition
                          Ë               :Map
                           m              :  Map
                            Î             :   First elements (card values)
                             ¬            :  Join
                              ú5          :  Right pad with spaces to length 5
                                 á5       :  Permutations of length 5
                                   Ã      :End map
                                    c     :Flatten

0

果冻,18字节

Ṣœc5Uµ13R;1wṪ€ȧEµƇ

在线尝试!

[..., ...][1个13]一种23456789ŤĴķ[1个4]CdH小号

输出格式:空列表为虚假,非空列表为真。


我没有在规格中看到任何暗示可以用整数代替西服和图片卡的东西-我错过了什么吗?
毛茸茸的

@Shaggy我认为它在“任何合理的格式”之内,我认为我们在输入纸牌方面没有默认设置。
暴民埃里克(Erik the Outgolfer)'18年

0

PHP,264字节

它回声1如果是同花顺和0或者null如果没有。

如果命名文件,1X则可以保存11 bytes,无需更改$argv[0]。目前不确定为什么文件名会破坏它。

由于某些原因,即使:;<=>字符串0123456789的ASCII值是58-62,ASCII值是48-57 ,它们asort在TIO中也要按字符串排序。因此,如果您从TIO链接或下面的代码中获取代码,并将PHPTester与以下测试套件一起使用,则它将起作用。:;<=>0123456789

$argb[0] = [".code.tio", "AS", "2S", "3S", "4S", "5S"]; // => true
$argb[1] = [".code.tio", "3D", "9C", "4S", "KH", "AD", "AC"]; // => false
$argb[2] = [".code.tio", "5D", "6D", "7D", "8H", "9D", "TD", "JD"]; // => false
$argb[3] = [".code.tio", "JC", "7C", "5D", "8C", "AC", "TC", "9C", "5S"]; // => true
$argb[4] = [".code.tio", ]; // => false
$argb[5] = [".code.tio", "AS", "2S", "3S"]; // => false
$argb[6] = [".code.tio", "JC", "QC", "KC", "AC", "2C"]; // => false
$argb[7] = [".code.tio", "TC", "JC", "QC", "KC", "AC", "2C"]; // => true
$argb[8] = [".code.tio", "2H", "3H", "4H", "5H", "6H", "7H"]; // => true

for ($z=0; $z<9;$z++){
    $argv=$argb[$z];
    array_shift($argv);
    unset($a,$b,$c,$d,$e,$f,$g,$h,$i);
    $f=false; // not needed, just removes several notices

    // TIO code here

    echo "<br>";

TIO代码

for($b=count($a=$argv);$b;){$a[0]='1X';$a[--$b]=strtr($a[$b],'ATJQK','1:;<=');$a[]=($a[$b][0]==1?">".$a[$b][1]:1);}asort($a);foreach($a as$c){$d[$c[1]][]=$c[0];}foreach($d as$e){if(4<$g=count($e)){for($h=0;$g>$i=4+$h;){$f|=(ord($e[$i])-ord($e[$h++])==4);}}}echo$f;

在线尝试!


0

Kotlin,226个字节

T用于10,因此所有卡的长度均为2个字符。

{h:List<String>->val m=List(4){mutableSetOf<Int>()}
for(c in h)m["CDHS".indexOf(c[1])].add("A23456789TJQK".indexOf(c[0]))
var r=0>1
for(b in m){if(b.contains(0))b.add(13)
for(i in 0..9)r=b.containsAll((i..i+4).toList())||r}
r}

在线尝试!


0

帕斯卡(FPC) 223个 216 210 209字节

var a,b:char;c:set of byte;i:byte;begin repeat readln(a,b);i:=pos(b,'HDC')*14+pos(a,'23456789TJQK');c:=c+[i];if a='A'then c:=c+[i+13]until eof;i:=0;while not([i..i+4]<=c)or(i mod 14>9)do i:=i+1;write(i<52)end.

在线尝试!

用途T为10.输入每行包含1张卡。

现在我打了这么多球,以至于我不知道它是如何工作的...

说明:

var a,b:char; //for reading cards
    c:set of byte; //this set is for remembering which cards are present in the input
                   //14 numbers used for each suit
    i:byte;
begin
  repeat
    readln(a,b);             //read rank into a, suit into b and a newline
    i:=pos(b,'HDC')*14+pos(a,'23456789TJQK');
        //temporary use i to calculate corresponding number for the card
        //pos() gives 0 if b is not found
        //1st pos() is for the group of numbers for that suit, 2nd pos() is for offset
    c:=c+[i];                //include i into set
    if a='A'then c:=c+[i+13] //if rank is A, include the number at the end of group as well
  until eof;
  i:=0;
  while not(
    ([i..i+4]<=c) //if NOT 5 cards in a row are present...
    and           //while the check is started from 10 (T)...
    (i mod 14<10) //(otherwise, it is checking across 2 different suits)
  )do i:=i+1;     //increment i, otherwise stop
  write(i<52) //if i<=51, there is a straight flush starting at the card corresponding to i
              //(if there isn't a straight flush, i stops at 252 due to i..i+4, I don't know why)
end.
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.