นี่คือการล้างตรงหรือไม่?


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 yep คุณจะไม่มีบัตรใบเดียวกันสองใบหรือมากกว่า
Luis felipe De jesus Munoz

4
เราขอ10เป็นได้Tไหม
Kevin Cruijssen

@ โจกิ้งฉันไม่คิดว่าจะเกิดขึ้นได้ IRL ;-)
Erik the Outgolfer

4
@EriktheOutgolfer แท้จริงฉันมีการ์ดผสมประมาณ 5 แพ็คน้อยกว่าจากฉันไปหนึ่งเมตร
Jo King

คำตอบ:


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ที่ปลายทั้งสองดังนั้นผมเชื่อว่าการเปลี่ยนแปลง36ที่จะ40ควรจะแก้ไขมัน
Jonathan Allan

โอ๊ะฉันนับไม่ถ้วน ฉันซ่อมมัน!
ลินน์

99 ไบต์
Chas Brown

สลับลำดับมูลค่าสูทและย้ายเงื่อนไข if ไปที่ดัชนีหรือไม่
Jo King


8

R , 128 126 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 โดย 26 ส่วนใหญ่ไร้สาระ แต่การ์ดทั้งหมด (ที่มีเอซทำซ้ำที่ด้านล่าง) ที่มีอยู่ในแถวที่ 10 ถึง 23 ของคอลัมน์ 3,4,8 และ 24 เมทริกซ์ถูกสร้างขึ้นโดยการรวมกันของตัวพิมพ์ใหญ่ทั้งหมด ตัวอักษรด้วยตัวอักษร J ผ่าน X แทนที่ด้วย A, 2-9, T, J, Q, K, A, S chartrผ่าน เราได้รับ C, D, H ฟรี!

%in%flattens เมทริกซ์คอลัมน์ฉลาดเข้าไปในเวกเตอร์ จากนั้นดูว่าการเข้ารหัสความยาวของรันนั้นมากกว่า 4 สำหรับการTRUEแข่งขันใด ๆ หรือไม่



94 ไบต์ สองการเปลี่ยนแปลง: การใช้สมมาตรouterโทรที่ผลิตบัตรที่ไม่ถูกต้องเป็นจำนวนมากและการใช้บังคับขู่เข็ญเวกเตอร์ของที่ควรหลีกเลี่ยงin applyพวกเขาทั้งคู่ต้องอยู่ในตำแหน่งนี้เพื่อทำงาน!
J.Doe

2
ดีมาก! เปลี่ยนคำตอบและทำให้เป็นวิกิชุมชน
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)

ลองออนไลน์!

อย่างไร?

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

เรติน่า 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`

แปลงค่าเป็น unary และเติมท้ายเพื่อให้การ์ดเรียงลำดับอย่างถูกต้อง

^
¶
((?(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)

ยอมรับอาร์เรย์ของการเป็นตัวแทนสตริงของบัตรการแทนที่ด้วย 10 ลองออนไลน์!T

คำอธิบาย

วนซ้ำในการ์ดแต่ละใบและตั้งค่าสถานะในชุดบูลีนโดยใช้ดัชนีที่คำนวณจากการผสมผสานที่เป็นเอกลักษณ์ของอันดับและชุดไพ่ อาร์เรย์นี้จะถูกทำให้เป็นสตริงเพื่ออนุญาตให้จับคู่รูปแบบของค่าความจริงที่ต่อเนื่องกัน 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
ดี สิ่งนี้สมควรได้รับการโหวตมากขึ้น แต่คนมักจะหมดความสนใจในการท้าทายสองสามวันหลังจากการโพสต์ครั้งแรก
Rick Hitchcock

2

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

รับอินพุตเป็นสตริงที่คั่นด้วยช่องว่าง (เช่น"AS 2S 3S 4S 5S")

-22 ไบต์ขอบคุณที่@ OlivierGrégoire
-1 ขอบคุณไบต์@AlexRacer

ลองออนไลน์

รหัส Golfed เวอร์ชันที่ฉันใช้กับProject Euler # 54ซึ่งฉันทำกับ regexes เป็นหลัก (เพื่อความสนุกสนานและเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับ regexes) โดยไม่ต้อง regexes มันอาจจะดีกว่าสำหรับประสิทธิภาพและง่ายขึ้น (อาจใช้สำหรับการเล่นกอล์ฟคำตอบนี้จะดูในภายหลัง)

คำอธิบาย:

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)

คำอธิบาย regex เพิ่มเติม:

  • "AKQJT98765432A".substring(i,i+5) ใช้ไพ่ห้าใบที่อยู่ติดกัน i
  • .replaceAll(".","(?=.*$0\\\\1)")แทนที่แต่ละบัตรเหล่านั้นด้วย"(?=.*c\\1)"(ซึ่งcเป็นตัวละครบัตร)
  • .replaceFirst(".1","([HSDC])")จากนั้นจะเข้ามาแทนที่คนแรกด้วย\\1([HSDC])

คือ regex ทั้งหมดเพื่อตรวจสอบ Straight Flush สำหรับการ์ดในช่วงค่า[9,5]จะกลายเป็น:
^(?=.*9([HSDC]))(?=.*8\\1)(?=.*7\\1)(?=.*6\\1)(?=.*5\\1).*$
(หมายเหตุ: String#matchesเพิ่ม trailing / นำโดยปริยาย^...$เพื่อตรวจสอบ String ทั้งหมด) Regex นี้จะ:

^(?=.*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 ไบต์ ฉันเล่นกอล์ฟรุ่น regex เท่านั้น: มันยังคงเป็นอัลกอริทึมของคุณ
Olivier Grégoire

1
167 ไบต์ ฉันลบ".*"+คำนำหน้าที่ไม่จำเป็นออก
Olivier Grégoire

1
@ OlivierGrégoireขอบคุณ! สนามกอล์ฟที่ดี
Kevin Cruijssen

1
-1 ไบต์ถ้าคุณแยกจากลูปแทนที่จะใช้f
AlexRacer

1
@AlexRacer สมาร์ทขอบคุณ! และสามารถที่จะเล่นกอล์ฟ 2 ไบต์มากขึ้นโดยการเปลี่ยนbreakไปi=-2และกลับไปreturn-1>i;ใช้วิธีการของคุณ (และอีก 2 ที่เปลี่ยนแปลง(.)ไป.และ$1ไป$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]A23456789TJQK[1,4]CDHS

รูปแบบผลลัพธ์: รายการที่ว่างเปล่าเป็นเท็จรายการที่ไม่ว่างเปล่าเป็นความจริง


ฉันไม่เห็นอะไรเลยในสเป็คที่บอกว่าจำนวนเต็มสามารถทดแทนชุดสูทและการ์ดรูปภาพได้ฉันพลาดอะไรไปหรือเปล่า
Shaggy

@Shaggy ฉันคิดว่ามันอยู่ใน "รูปแบบที่สมเหตุสมผล" ฉันไม่คิดว่าเรามีค่าเริ่มต้นเกี่ยวกับการใส่ไพ่
Erik the Outgolfer

0

PHP , 264 ไบต์

มันสะท้อน1ถ้ามันเป็นตรงเปี่ยมและ0หรือnullถ้าไม่

หากคุณตั้งชื่อไฟล์1Xนั้นคุณสามารถบันทึกในขณะที่คุณไม่จำเป็นต้องมีการเปลี่ยนแปลง11 bytes $argv[0]ไม่แน่ใจในขณะนี้ว่าทำไมชื่อไฟล์สามารถทำลายได้

ด้วยเหตุผลบางอย่างสตริง:;<=>จะถูกเรียงลำดับก่อนที่สตริง0123456789โดยasortใน TIO แม้ว่าจะ:;<=>มีค่า ASCII 58-62 และ0123456789มีค่า ASCII 48-57 ดังนั้นหากคุณใช้รหัสจากลิงค์ TIO หรือด้านล่างและใช้PHPTesterกับชุดทดสอบต่อไปนี้มันจะทำงาน

$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

Pascal (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.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.