Ist das ein Straight Flush?

21

Verwandte: Nennen Sie die Pokerhand

Ein Straight Flush ist eine Pokerhand, die fünf aufeinanderfolgende Karten derselben Farbe enthält. Als Teil eines Straight Flushs kann ein Ass entweder über einem König oder unter einer Zwei stehen. Ein Ass kann entweder einen hohen Rang haben (z. B. A ♥ K ♥ Q ♥ J ♥ 10 ♥ ist ein Straight Flush mit einem hohen Ass) oder einen niedrigen Rang (z. B. 5 ♦ 4 ♦ 3 ♦ 2 ♦ A ♦ ist ein Straight Flush mit fünf Höhen) kann nicht in derselben Hand sowohl hoch als auch niedrig rangieren (zB Q ♣ K ♣ A ♣ 2 ♣ 3 ♣ ist ein Flush mit Ass-Höhe, kein Straight Flush).

Herausforderung

Gegebene NKarten (in jedem vernünftigen Format) geben einen Wahrheitswert aus, wenn ein Straight Flush in der Pokerhand enthalten ist.

Eingang

  • NAnzahl der Karten. (In jedem vernünftigen Format)

Es gibt vier Anzüge; Herzen, Pik, Diamanten und Keulen (H, S, D, C).

Jede Farbe hat eine Karte für die Nummern 2 bis 10 sowie 4 'Bild'-Karten, Ass, Bube, Dame und König (A, J, Q, K)

Hinweis: Sie können 10 als T nehmen

Ausgabe

  • Truthy/Falsy Wert

Testfall

["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

Standard .

Gewinnkriterien: Kürzester Code in jeder Sprache

Luis Felipe De Jesus Munoz
quelle
1
Dürfen wir annehmen, dass nicht zwei gleiche Karten auf der Hand sind?
Jo King
@JoKing yep, Sie werden nicht zweimal oder mehr die gleiche Karte haben
Luis Felipe De Jesus Munoz
4
Dürfen wir 10als nehmen T?
Kevin Cruijssen
@JoKing Ich glaube nicht, dass IRL passieren kann. ;-)
Erik der Outgolfer
4
@EriktheOutgolfer Ich habe buchstäblich etwa 5 Packungen gemischter Karten weniger als einen Meter von mir entfernt
Jo King

Antworten:

15

Python 2 , 95 Bytes

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

Probieren Sie es online!

Es gibt 40 mögliche Straight Flushes, die einfach alle überprüft werden. Chas Brown sparte 2 Bytes; Jo King sparte 4 weitere.

Lynn
quelle
1
Es gibt 40, verwendete man Aan beiden Enden so glaube ich, zu ändern , 36um 40es beheben soll.
Jonathan Allan
Hoppla, kann ich nicht gut zählen? Ich habe es repariert!
Lynn
99 Bytes .
Chas Brown
Tauschen Sie die Anzugswertreihenfolge und verschieben Sie die if-Bedingung in den Index?
Jo King
95 Bytes
Jo King
8

R , 128 126 94 91 Bytes

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

Probieren Sie es online!

Ursprüngliche Logik durch @ J.Doe erheblich verkürzt.

Bildet eine 26x26-Matrix mit größtenteils Unsinn, aber allen Karten (mit den Assen, die unten wiederholt werden), die in den Zeilen 10 bis 23 der Spalten 3, 4, 8 und 24 enthalten sind. Die Matrix wird durch Verketten aller Kombinationen der Großbuchstaben erstellt Alphabet mit den Buchstaben J bis X ersetzt durch A, 2-9, T, J, Q, K, A, S über chartr . Wir bekommen C, D, H gratis!

Das %in%glättet die Matrix spaltenweise in einen Vektor. Prüfen Sie dann, ob die Lauflängencodierung für eine Reihe von TRUEÜbereinstimmungen größer als 4 ist .

ngm
quelle
Clevere Verwendung von rleAND outer! Dies spart zwei Bytes
JayCe
94 Bytes. Zwei Änderungen: Verwenden eines symmetrischen outerAufrufs, der viele ungültige Karten erzeugt, und Verwenden des Vektorkräfts von in, um zu vermeiden apply. Sie müssen beide vorhanden sein, damit dies funktioniert!
J.Doe
2
Sehr schön! Die Antwort wurde geändert und zu einem Community-Wiki gemacht.
ngm
5

JavaScript (ES6), 116 Byte

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)

Probieren Sie es online!

Wie?

Für jeden Anzug wandeln wir alle Karten c der Anzug s in eine 14-Bit - Bit - Maske mscsm , doppelte Bit # 13 (Ace) zu Bit # 0 das zu handhaben Stahlrad (A, 2,3,4,5) und Zählung die Anzahl aufeinanderfolgender Bits. Wenn es größer als 4 ist, haben wir einen Straight Flush.

Arnauld
quelle
5
Ich habe mich so sehr an Ihre Einführung in die "Curry-Notation" gewöhnt, dass ich sie vermisse, wenn sie nicht gebraucht wird.
ngm
4

Brachylog , 31 Bytes

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

Probieren Sie es online!

 ᵍ                    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"
Sundar - Setzen Sie Monica wieder ein
quelle
3

Retina 0.8.2 , 66 Bytes

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

Probieren Sie es online! Erläuterung:

J
11
Q
12
K
13

Wandeln Sie die Bildkarten in ihre Werte um.

A
1$%'¶14

A kann 1 oder 14 sein.

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

Konvertieren Sie den Wert in "unary" und setzen Sie ein Suffix, damit die Karten richtig sortiert werden.

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

Kombiniere 5 Karten, die jedes Mal um 1 erhöht werden und stelle sicher, dass die letzte Erhöhung genau 1 war.

Neil
quelle
2

JavaScript (ES6), 106 Byte

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)

Akzeptiert eine Reihe von Zeichenfolgendarstellungen von Karten und ersetzt diese 10durch T. Probieren Sie es online!

Erläuterung

Durchläuft jede Karte und setzt ein Flag in einem Array von Booleschen Werten, wobei ein Index verwendet wird, der aus der eindeutigen Kombination von Rang und Farbe berechnet wird. Dieses Array wird dann verkettet, um den Abgleich eines Musters von 5 aufeinanderfolgenden Wahrheitswerten zu ermöglichen.

Beispielsweise kann eine Hand mit einem Straight Flush Folgendes als Teil der vollständigen Zeichenfolgendarstellung des booleschen Arrays erzeugen: ,,,,1,1,1,1,1,,,,

Da der erste Rangwert (dh A) vom Anfang der Zeichenfolge abweicht, werden immer leere Werte vor allen Werten 1im Array angezeigt, wodurch sichergestellt wird, dass die Zeichenfolgendarstellung mit a beginnt,

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 ,
Redundanz
quelle
2
Nett. Dies verdient mehr Stimmen, aber die Leute neigen dazu, ein paar Tage nach der ersten Veröffentlichung das Interesse an Herausforderungen zu verlieren.
Rick Hitchcock
2

Java 10, 189 167 165 164 160 157 156 Bytes

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

Nimmt die Eingabe als einzelne durch Leerzeichen getrennte Zeichenfolge (d. H "AS 2S 3S 4S 5S" ).

-22 Bytes dank @ OlivierGrégoire .
-1 Byte dank @AlexRacer .

Probieren Sie es online aus.

Golfed-Version des Codes, den ich für Project Euler # 54 verwendet habe , das ich hauptsächlich mit regulären Ausdrücken gemacht habe (zum Spaß und um mehr über reguläre Ausdrücke zu erfahren). Ohne reguläre Ausdrücke wäre es wahrscheinlich besser für die Leistung und einfacher gewesen (gilt wahrscheinlich auch für das Golfen dieser Antwort; wird später noch genauer betrachtet).

Erläuterung:

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)

Zusätzliche Regex-Erklärung:

  • "AKQJT98765432A".substring(i,i+5) Nimmt fünf benachbarte Karten basierend auf i
  • .replaceAll(".","(?=.*$0\\\\1)")ersetzt jede dieser Karten mit "(?=.*c\\1)"(woc ist der Kartencharakter)
  • .replaceFirst(".1","([HSDC])")wird dann die erste \\1durch ersetzen ([HSDC]).

Dh die gesamte Regex des Straight Flush für Karten im Wert-Bereich zu überprüfen , [9,5]wird werden:
^(?=.*9([HSDC]))(?=.*8\\1)(?=.*7\\1)(?=.*6\\1)(?=.*5\\1).*$
(Hinweis: String#matchesimplizit fügt den nachlauf / führende ^...$. Die gesamte Zeichenfolge zu überprüfen) Diese Regex wird:

^(?=.*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
Kevin Cruijssen
quelle
1
172 Bytes . Ich habe nur die Regex-Generation gespielt: Es ist immer noch Ihr Algorithmus.
Olivier Grégoire
1
167 Bytes . Ich habe das unnötige ".*"+Präfix entfernt.
Olivier Grégoire
1
@ OlivierGrégoire Danke! Schöne Golfplätze.
Kevin Cruijssen
1
-1 Byte, wenn Sie aus der Schleife ausbrechen, anstattf
AlexRacer
1
@AlexRacer Smart, danke! Und in der Lage gewesen zu sein, 2 weitere Bytes zu golfen, indem man das breakzu i=-2und die Rückkehr zur return-1>i;Verwendung Ihres Ansatzes änderte (und 2 weitere, die sich (.)zu .und $1zu änderten $0). :)
Kevin Cruijssen
1

Sauber , 145 135 Bytes

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))==[]]

Probieren Sie es online!

Vereinfacht:

? 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
       ]
Οurous
quelle
1

Japt , 37 Bytes

Übernimmt die Eingabe als 2D-Array.

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

Versuch es


Erläuterung

"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
Zottelig
quelle
0

Jelly , 18 Bytes

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

Probieren Sie es online!

[..., ...][1,13]EIN23456789TJQ.K[1,4]CDHS verbunden. Die TIO-Verbindung akzeptiert Eingaben im Format der Testfälle.

Ausgabeformat: Leere Liste als falsch, nicht leere Liste als wahr.

Erik der Outgolfer
quelle
Ich sehe in den technischen Daten nichts, was darauf hindeutet, dass die Farben und Bildkarten durch ganze Zahlen ersetzt werden können. Habe ich etwas übersehen?
Shaggy
@ Shaggy Ich gehe davon aus, dass das in "jedem vernünftigen Format" liegt. Ich glaube nicht, dass wir Standardeinstellungen für die Eingabe von Spielkarten haben.
Erik der Outgolfer
0

PHP , 264 Bytes

Es schallt, 1wenn es ein Straight Flush ist und0 oder nullnicht.

Wenn Sie die Datei benennen 1X, können Sie sie speichern11 bytes da Sie sie nicht ändern müssen$argv[0] . Ich bin mir im Moment nicht sicher, warum der Dateiname ihn beschädigen kann.

Aus irgendeinem Grund werden die Zeichenfolgen in TIO :;<=>vor den Zeichenfolgen 0123456789nach sortiert asort, obwohl sie :;<=>die ASCII-Werte 58-62 und 0123456789die ASCII-Werte 48-57 haben. Wenn Sie also den Code vom TIO-Link oder darunter nehmen und PHPTester mit der folgenden Testsuite verwenden, funktioniert es.

$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-Code

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;

Probieren Sie es online!

Sam Dean
quelle
0

Kotlin , 226 Bytes

Verwendet T für 10, damit alle Karten 2 Zeichen lang sind.

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

Probieren Sie es online!

JohnWells
quelle
0

Pascal (FPC) , 223 216 210 209 Bytes

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.

Probieren Sie es online!

Verwendet T für 10. Eingang enthält 1 Karte pro Zeile.

Jetzt habe ich so viel Golf gespielt, dass ich nicht mehr weiß, wie es funktioniert ...

Erläuterung:

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.
AlexRacer
quelle