これはストレートフラッシュですか?


21

関連:ポーカーハンドに名前を付ける

ストレートフラッシュとは、同じスーツのシーケンシャルランクのカードが5枚入っているポーカーハンドです。ストレートフラッシュの一部として、エースはキングより上または2より下にランクできます。エースは高いランク(例:A♥K♥Q♥J♥10♥はエースハイストレートフラッシュ)またはロー(例:5♦4♦3♦2♦A♦は5ハイストレートフラッシュ)ですが、同じ手でハイとローの両方をランク付けすることはできません(例:Q♣K♣A♣2♣3♣はストレートフラッシュではなくエースハイフラッシュです)。

チャレンジ

Nポーカーハンドにストレートフラッシュが含まれている場合、与えられたカード(合理的な形式)は真実の値を出力します。

入力

  • Nカードの数。(合理的な形式で)

4つのスーツがあります。ハート、スペード、ダイヤモンド、クラブ(H, S, D, C)

各スーツには、2〜10の数字用のカードが1枚と、「絵」カード、エース、ジャック、クイーン、キングの4枚があります。 (A, J, Q, K)

注:Tとして10を使用できます

出力

  • 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
手札に同じカードが2枚ないことを想定できますか?
ジョーキング

@JoKingうん、同じカードを2回以上持っていない
ルイスフェリペデジェススムニョス

4
10として取ることができTますか?
ケビンCruijssen

@JoKing IRLが起こることはないと思います。;-)
アウトゴルファーのエリック

4
@EriktheOutgolfer文字通り、5パックのミックスカードが1メートル以内にあります
ジョーキング

回答:


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バイトを節約しました。ジョー・キングはさらに4人を救った。


1
40がありA、両端で使用しているので、変更する36こと40で修正する必要があると思います。
ジョナサンアラン

おっと、私は数えるのが苦手です。それを私が直した!
リン


スーツの値の順序を入れ替えて、if条件をインデックスに移動しますか?
ジョーキング


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によって大幅に短縮されました。

ほとんど無意味ですが、列3,4,8および24の行10から23に含まれるすべてのカード(下部に繰り返されるエースを持つ)で26 x 26のマトリックスを作成します。マトリックスは、大文字のすべての組み合わせを連結して作成されますJからXまでの文字がA、2-9、T、J、Q、K、A、Sに置き換えられたアルファベット chartrます。C、D、Hが無料で手に入ります!

%in%ベクターに列方向行列を平坦化。次に、TRUE一致の実行に対してランレングスエンコーディングが4より大きいかどうかを確認します。



94バイト。 2つの変更点:outer多数の無効なカードを生成する対称呼び出しの使用、およびをin回避するためののベクトル強制の使用apply。これが機能するには、両方とも適切な場所になければなりません!
-J.Doe

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)

オンラインでお試しください!

どうやって?

各スーツのため、我々は、すべてのカードに変換CスーツのSを 14ビットのビットマスクにM扱うために重複ビット#13(ACE)のビット#0に、スチールホイール(A、2,3,4,5)とカウント連続するビットの数。4より大きい場合、ストレートフラッシュになります。scsm


5
私はあなたの「カリー記法」入門ラインにあまりにも慣れてしまったので、それが必要でないときには見逃しています。
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

Retina 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

毎回1ずつ増加する5枚のカードを照合し、最後の増加が正確に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、配列内のすべてのの前に常に空の値があり、文字列表現が,

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;}

入力をスペースで区切られた単一の文字列(ie "AS 2S 3S 4S 5S")として受け取ります。

@OlivierGrégoireのおかげで-22バイト。@AlexRacerの
おかげで-1バイト。

オンラインでお試しください。

Project Euler#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) に基づいて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ありがとう!素敵なゴルフ。
ケビンCruijssen

1
使用する代わりにループから抜ける場合は-1バイトf
AlexRacer

1
@AlexRacer Smart、ありがとう!そして、アプローチを使用してbreakto i=-2とreturnを変更することで、さらに2バイトをゴルフすることができましたreturn-1>i;(さらに(.)to .$1toを2つ変更し$0ます)。:)
ケビンクルーイッセン

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µƇ

オンラインでお試しください!

実際の入力形式:[..., ...]それぞれ2つの整数のリストのリスト()。最初は整数です[113]、 ために A23456789TJQK それぞれ、2番目は [14]、 ために CDHSそれぞれ。TIOリンクは、テストケースの形式の入力を受け入れます。

出力形式:偽の空のリスト、真実の空のリスト。


仕様書には、スーツや絵カードの代わりに整数を使用できることを示唆するものは何もありません。何か見落としていましたか?
シャギー

@Shaggy私はそれが「合理的なフォーマット」内にあると思います、トランプの入力に関してデフォルトがあるとは思いません。
エリックアウトゴルファー

0

PHP、264バイト

1まっすぐなフラッシュである0nullどうかにかかわらず、エコーします。

ファイルに名前を付けると、変更する必要がないので1X保存できます。現時点では、ファイル名が壊れる理由は不明です。11 bytes$argv[0]

何らかの理由で、ASCII値が58〜62でASCII値が48〜57であっても、TIOで:;<=>文字列の前に文字列が並べ替え0123456789られます。したがって、TIOリンク以下からコードを取得して、次のテストスイートでPHPTesterを使用すると動作します。asort:;<=>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

パスカル(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.

オンラインでお試しください!

用途 T10にします。入力には1行に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.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.