Apakah ini flush yang lurus?


21

Terkait: Beri nama tangan poker

Straight flush adalah kartu poker yang berisi lima kartu peringkat berurutan, semuanya berjenis sama. Sebagai bagian dari flush lurus, kartu As dapat peringkat di atas seorang raja atau di bawah dua. Ace dapat peringkat tinggi (mis. A ♥ K ♥ Q ♥ J ♥ 10 ♥ adalah siraman lurus ace-high) atau rendah (mis. 5 ♦ 4 ♦ 3 ♦ 2 ♦ A ♦ adalah straight flush lima-tinggi), tetapi tidak dapat peringkat tinggi dan rendah di tangan yang sama (misalnya Q ♣ K ♣ A ♣ 2 ♣ 3 ♣ adalah flush ace-tinggi, bukan flush lurus).

Tantangan

NKartu yang diberikan (dalam format apa pun yang masuk akal) menghasilkan nilai yang jujur ​​jika flush lurus ada di tangan poker.

Memasukkan

  • Njumlah kartu. (Dalam format apa pun yang masuk akal)

Ada empat setelan; hati, sekop, berlian, dan klub (H, S, D, C).

Setiap suit memiliki satu kartu untuk angka 2 hingga 10, ditambah 4 kartu 'gambar', Ace, Jack, Queen, dan King (A, J, Q, K)

Catatan: Anda dapat mengambil 10 sebagai T

Keluaran

  • Truthy/Falsy nilai

Kasus cobaan

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

Aturan standar berlaku.

Kriteria pemenang: Kode terpendek di setiap bahasa


1
Bisakah kita berasumsi bahwa tidak akan ada dua kartu yang sama di tangan?
Jo King

@JoKing ya, Anda tidak akan memiliki kartu yang sama dua kali atau lebih
Luis felipe De jesus Munoz

4
Mungkin kita mengambil 10sebagai T?
Kevin Cruijssen

@JoKing Saya tidak berpikir itu bisa terjadi IRL. ;-)
Erik the Outgolfer

4
@EriktheOutgolfer Saya benar-benar memiliki sekitar 5 bungkus kartu campuran kurang dari satu meter dari saya
Jo King

Jawaban:


15

Python 2 , 95 byte

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

Cobalah online!

Ada 40 kemungkinan straight flushes, dan ini hanya memeriksa semuanya. Chas Brown menyimpan 2 byte; Jo King menyimpan 4 lebih banyak.


1
Ada 40, yang digunakan Apada kedua ujungnya jadi saya percaya berubah 36untuk 40harus memperbaikinya.
Jonathan Allan

Ups, bukankah saya pandai menghitung. Aku telah memperbaikinya!
Lynn


Tukar urutan nilai-setelan dan pindahkan kondisi if ke indeks?
Jo King


8

R , 128 126 94 91 byte

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

Cobalah online!

Logika asli diperpendek oleh @ J.Doe.

Membuat matriks 26 kali 26 dengan kebanyakan omong kosong tetapi semua kartu (dengan Aces diulang di bagian bawah) terkandung dalam baris 10 hingga 23 kolom 3,4,8 dan 24. Matriks dibuat dengan menggabungkan semua kombinasi huruf besar alfabet dengan huruf J hingga X digantikan oleh A, 2-9, T, J, Q, K, A, S via chartr. Kami mendapatkan C, D, H gratis!

The %in%merata matriks kolom-bijaksana dalam vektor. Kemudian lihat apakah pengkodean run-length lebih besar dari 4 untuk setiap TRUEpertandingan yang cocok.


Penggunaan pintar rleAND outer! Ini menghemat dua byte
JayCe

94 byte Dua perubahan: menggunakan outerpanggilan simetris yang menghasilkan banyak kartu yang tidak valid, dan menggunakan paksaan vektor inuntuk menghindari apply. Mereka berdua harus ada di tempat ini agar bisa bekerja!
J.Doe

2
Sangat bagus! Mengubah jawabannya dan menjadikannya wiki komunitas.
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)

Cobalah online!

Bagaimana?

scsm


5
Saya sudah terbiasa dengan baris pengantar "currying notation" Anda sehingga saya melewatkannya saat itu tidak diperlukan.
ngm

4

Brachylog , 31 byte

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

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

3

Retina 0.8.2 , 66 byte

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

Cobalah online! Penjelasan:

J
11
Q
12
K
13

Konversikan kartu gambar menjadi nilainya.

A
1$%'¶14

A bisa 1 atau 14.

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

Konversikan nilainya menjadi unary, dan sufiks agar kartu tersortir dengan benar.

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

Cocokkan 5 kartu yang bertambah 1 setiap kali, dan pastikan bahwa kenaikan terakhir tepat 1.


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)

Menerima susunan representasi string dari kartu, menggantikannya 10dengan T. Cobalah online!

Penjelasan

Ulangi setiap kartu dan atur bendera dalam array boolean menggunakan indeks yang dihitung dari kombinasi unik peringkat dan suitnya. Array ini kemudian diubah untuk memungkinkan pencocokan pola 5 nilai kebenaran berturut-turut.

Misalnya, sebuah tangan dengan flush lurus dapat menghasilkan yang berikut sebagai substring dari representasi string penuh dari array boolean: ,,,,1,1,1,1,1,,,,

Karena nilai peringkat pertama (yaitu A) diimbangi dari awal string, akan selalu ada nilai kosong sebelum semua 1dalam array, memastikan representasi string akan dimulai dengan,

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
Bagus. Ini pantas mendapatkan lebih banyak suara, tetapi orang-orang cenderung kehilangan minat pada tantangan beberapa hari setelah posting awal.
Rick Hitchcock

2

Java 10, 189 167 165 164 160 157 156 byte

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

Mengambil input sebagai String dengan batasan ruang tunggal (yaitu "AS 2S 3S 4S 5S").

-22 byte terima kasih kepada @ OlivierGrégoire .
-1 byte terima kasih kepada @AlexRacer .

Cobalah online.

Versi kode yang telah saya gunakan untuk Project Euler # 54 , yang terutama saya lakukan dengan regex (untuk bersenang-senang dan untuk mempelajari lebih lanjut tentang regex). Tanpa regex mungkin akan lebih baik untuk kinerja dan lebih mudah (mungkin juga berlaku untuk bermain golf jawaban ini; akan kita lihat nanti).

Penjelasan:

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)

Penjelasan regex tambahan:

  • "AKQJT98765432A".substring(i,i+5) membutuhkan lima kartu yang berdekatan berdasarkan i
  • .replaceAll(".","(?=.*$0\\\\1)")mengganti masing-masing kartu dengan "(?=.*c\\1)"(di mana ckarakter kartu)
  • .replaceFirst(".1","([HSDC])")maka akan menggantikan pertama \\1dengan ([HSDC]).

Ie total regex untuk memeriksa Straight Flush untuk kartu dalam rentang nilai [9,5]akan menjadi:
^(?=.*9([HSDC]))(?=.*8\\1)(?=.*7\\1)(?=.*6\\1)(?=.*5\\1).*$
(CATATAN: String#matchessecara implisit menambahkan trailing / mengarah ^...$untuk memeriksa seluruh String.) Regex ini akan:

^(?=.*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 byte . Saya hanya bermain golf generasi regex: itu masih algoritma Anda.
Olivier Grégoire

1
167 byte . Saya menghapus ".*"+awalan yang tidak perlu .
Olivier Grégoire

1
@ OlivierGrégoire Terima kasih! Golf yang bagus.
Kevin Cruijssen

1
-1 byte jika Anda keluar dari loop alih-alih menggunakanf
AlexRacer

1
@AlexRacer Smart, terima kasih! Dan dapat melakukan golf 2 byte lebih banyak dengan mengubah breakto i=-2dan kembali return-1>i;menggunakan pendekatan Anda (dan 2 lagi mengubah (.)to .dan $1to $0). :)
Kevin Cruijssen

1

Bersih , 145 135 byte

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

Cobalah online!

Sederhana:

? 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 byte

Mengambil input sebagai array 2D.

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

Cobalah


Penjelasan

"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

Jelly , 18 byte

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

Cobalah online!

[..., ...][1,13]A23456789TJQK[1,4]CDHS

Format output: daftar kosong sebagai salah, daftar tidak kosong sebagai kebenaran.


Saya tidak melihat apa pun dalam spesifikasi yang menunjukkan bahwa bilangan bulat dapat diganti untuk kartu jas dan kartu gambar - apakah saya melewatkan sesuatu?
Shaggy

@ Shaggy Saya menganggap itu dalam "format apa pun yang masuk akal", saya tidak berpikir kita memiliki default tentang memasukkan kartu remi.
Erik the Outgolfer

0

PHP , 264 byte

Ini bergema 1jika itu adalah flush lurus dan 0atau nulljika tidak.

Jika Anda memberi nama file 1Xmaka Anda dapat menyimpan 11 byteskarena Anda tidak perlu mengubah $argv[0]. Tidak yakin pada saat mengapa nama file dapat memecahkannya.

Untuk beberapa alasan string :;<=>diurutkan sebelum string 0123456789oleh asortdi TIO meskipun :;<=>memiliki nilai ASCII 58-62 dan 0123456789memiliki nilai ASCII 48-57. Jadi jika Anda mengambil kode dari tautan TIO atau di bawah ini dan menggunakan PHPTester dengan suite tes berikut ini berfungsi.

$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>";

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

Cobalah online!


0

Kotlin , 226 byte

Digunakan T untuk 10 sehingga semua kartu memiliki panjang 2 karakter.

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

Cobalah online!


0

Pascal (FPC) , 223 216 210 209 byte

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.

Cobalah online!

Penggunaan Tuntuk 10. Input berisi 1 kartu per baris.

Sekarang saya bermain golf begitu banyak sehingga saya tidak tahu cara kerjanya lagi ...

Penjelasan:

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.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.