Đây có phải là một tuôn thẳng?


21

Liên quan: Đặt tên cho tay bài xì phé

Một ván thẳng là một ván bài xì phé chứa năm lá bài xếp hạng liên tiếp, tất cả đều giống nhau. Là một phần của một cú đánh thẳng, một con át chủ bài có thể xếp hạng trên một vị vua hoặc dưới hai người. Một con át chủ bài có thể xếp hạng cao (ví dụ A ♥ K ♥ Q ♥ J ♥ 10 ♥ là một cú đánh thẳng cao của ace) hoặc thấp (ví dụ 5 ♦ 4 ♦ 3 ♦ 2 ♦ A ♦ là một cú đánh thẳng cao năm điểm), nhưng không thể xếp hạng cả cao và thấp trong cùng một bàn tay (ví dụ: Q K A 2 ♣ 3 là một lần xả cao, không phải là một cú đánh thẳng).

Thử thách

Các Nthẻ đã cho (ở bất kỳ định dạng hợp lý nào) tạo ra giá trị trung thực nếu một lần xả thẳng được chứa trong tay bài xì phé.

Đầu vào

  • Nsố lượng thẻ. (Trong bất kỳ định dạng hợp lý)

Có bốn bộ quần áo; trái tim, thuổng, kim cương, và câu lạc bộ (H, S, D, C).

Mỗi bộ đồ có một thẻ cho các số từ 2 đến 10, cộng với 4 thẻ 'hình ảnh', Ace, Jack, Nữ hoàng và Vua (A, J, Q, K)

Lưu ý: Bạn có thể lấy 10 làm T

Đầu ra

  • Truthy/Falsy giá trị

Trường hợp thử nghiệm

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

Luật tiêu chuẩn được áp dụng.

Tiêu chí chiến thắng: Mã ngắn nhất trong mỗi lang


1
Chúng ta có thể cho rằng sẽ không có hai thẻ giống nhau trong tay không?
Jo King

@JoKing yep, bạn sẽ không có cùng một thẻ hai lần trở lên
Luis felipe De jesus Munoz

4
Chúng ta có thể lấy 10như Tthế nào?
Kevin Cruijssen

@JoKing Tôi không nghĩ điều đó có thể xảy ra IRL. ;-)
Erik the Outgolfer 27/07/18

4
@EriktheOutgolfer Tôi thực sự có khoảng 5 gói thẻ hỗn hợp cách tôi một mét
Jo King

Câu trả lời:


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))

Hãy thử trực tuyến!

Có 40 lần xả thẳng có thể, và điều này chỉ đơn giản là kiểm tra tất cả. Chas Brown đã lưu 2 byte; Jo King đã cứu thêm 4 người nữa.


1
Có 40 bạn đã dùng Aở cả hai đầu vì vậy tôi tin rằng thay đổi 36để 40nên sửa chữa nó.
Jonathan Allan

Rất tiếc, tôi không giỏi đếm. Tôi sửa nó rồi!
Lynn


Hoán đổi thứ tự giá trị phù hợp và di chuyển điều kiện if sang chỉ mục?
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)

Hãy thử trực tuyến!

Logic gốc rút ngắn đáng kể bởi @ J.Doe.

Tạo một ma trận 26 x 26 với hầu hết là vô nghĩa nhưng tất cả các thẻ (với các Aces được lặp lại ở phía dưới) có trong các hàng 10 đến 23 của các cột 3,4,8 và 24. Ma trận được tạo bằng cách ghép tất cả các kết hợp của chữ hoa bảng chữ cái với các chữ cái J đến X được thay thế bằng A, 2-9, T, J, Q, K, A, S thông qua chartr. Chúng tôi nhận được C, D, H miễn phí!

Việc %in%làm phẳng cột ma trận thành một vectơ. Sau đó xem liệu mã hóa độ dài chạy lớn hơn 4 cho bất kỳ lần chạy TRUEphù hợp nào.


Sử dụng thông minh rleouter! Điều này tiết kiệm hai byte
JayCe

94 byte. Hai thay đổi: sử dụng outerlệnh gọi đối xứng tạo ra nhiều thẻ không hợp lệ và sử dụng cưỡng chế véc tơ inđể tránh apply. Cả hai phải có mặt để làm việc này!
J.Doe

2
Rất đẹp! Thay đổi câu trả lời và biến nó thành wiki cộng đồng.
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)

Hãy thử trực tuyến!

Làm sao?

scsm


5
Tôi đã quá quen với dòng giới thiệu "ký hiệu cà ri" của bạn đến nỗi tôi nhớ nó khi không cần thiết.
ngm

4

Brachylog , 31 byte

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

Hãy thử trực tuyến!

 ᵍ                    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

Võng mạc 0.8.2 , 66 byte

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

Hãy thử trực tuyến! Giải trình:

J
11
Q
12
K
13

Chuyển đổi thẻ hình ảnh thành giá trị của họ.

A
1$%'¶14

A có thể là 1 hoặc 14.

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

Chuyển đổi giá trị thành unary và hậu tố nó để các thẻ sắp xếp đúng.

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

Ghép 5 thẻ tăng 1 lần mỗi lần và đảm bảo rằng lần tăng cuối cùng chính xác là 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)

Chấp nhận một loạt các biểu diễn chuỗi của thẻ, thay thế 10bằng T. Hãy thử trực tuyến!

Giải trình

Lặp lại trên mỗi thẻ và đặt cờ trong một loạt các booleans bằng cách sử dụng một chỉ mục được tính từ sự kết hợp duy nhất của thứ hạng và bộ đồ. Mảng này sau đó được xâu chuỗi để cho phép khớp một mẫu gồm 5 giá trị trung thực liên tiếp.

Ví dụ, một bàn tay với một đường thẳng có thể tạo ra chuỗi dưới đây như là một chuỗi con của biểu diễn chuỗi đầy đủ của mảng boolean: ,,,,1,1,1,1,1,,,,

Vì giá trị xếp hạng đầu tiên (tức là A) được bù từ đầu chuỗi, sẽ luôn có các giá trị trống trước tất cả 1các mảng trong chuỗi, đảm bảo biểu diễn chuỗi sẽ bắt đầu bằng một,

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
Tốt đẹp. Điều này xứng đáng được nhiều phiếu hơn, nhưng mọi người có xu hướng mất hứng thú với những thách thức một vài ngày sau khi đăng bài ban đầu.
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;}

Lấy đầu vào dưới dạng một chuỗi được phân tách bằng dấu cách (ví dụ "AS 2S 3S 4S 5S").

-22 byte nhờ @ OlivierGrégoire .
-1 byte nhờ @AlexRacer .

Hãy thử trực tuyến.

Phiên bản được đánh gôn của mã mà tôi đã sử dụng cho Project Euler # 54 , mà tôi chủ yếu làm với regexes (để giải trí và để tìm hiểu thêm về regexes). Nếu không có regex, có lẽ sẽ tốt hơn cho hiệu suất và dễ dàng hơn (có lẽ cũng áp dụng cho việc đánh golf câu trả lời này; sẽ xem xét sau).

Giải trình:

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)

Giải thích về regex bổ sung:

  • "AKQJT98765432A".substring(i,i+5) mất năm thẻ liền kề dựa trên i
  • .replaceAll(".","(?=.*$0\\\\1)")thay thế mỗi thẻ đó bằng "(?=.*c\\1)"( cký tự thẻ ở đâu)
  • .replaceFirst(".1","([HSDC])")sau đó sẽ thay thế đầu tiên \\1bằng ([HSDC]).

Tức là tổng regex để kiểm tra Straight Flush cho các thẻ trong phạm vi giá trị [9,5]sẽ trở thành:
^(?=.*9([HSDC]))(?=.*8\\1)(?=.*7\\1)(?=.*6\\1)(?=.*5\\1).*$
(LƯU Ý: String#matchesngầm định thêm dấu / dẫn ^...$để kiểm tra toàn bộ Chuỗi.) Regex này sẽ:

^(?=.*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 . Tôi chỉ đánh gôn thế hệ regex: nó vẫn là thuật toán của bạn.
Olivier Grégoire

1
167 byte . Tôi đã loại bỏ ".*"+tiền tố không cần thiết .
Olivier Grégoire

1
@ OlivierGrégoire Cảm ơn! Sân golf đẹp.
Kevin Cruijssen

1
-1 byte nếu bạn thoát ra khỏi vòng lặp thay vì sử dụngf
AlexRacer

1
@AlexRacer Thông minh, cảm ơn! Và đã có thể chơi golf hơn 2 byte bằng cách thay đổi breakđể i=-2và quay trở lại return-1>i;sử dụng cách tiếp cận của bạn (và 2 thay đổi nhiều (.)đến .$1đến $0). :)
Kevin Cruijssen

1

Sạch , 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))==[]]

Hãy thử trực tuyến!

Giản thể:

? 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

Đưa đầu vào dưới dạng mảng 2D.

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

Thử nó


Giải trình

"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

Thạch , 18 byte

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

Hãy thử trực tuyến!

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

Định dạng đầu ra: danh sách trống là giả, danh sách không trống là trung thực.


Tôi không thấy bất cứ điều gì trong thông số kỹ thuật gợi ý rằng số nguyên có thể được thay thế cho bộ quần áo và thẻ hình ảnh - tôi có bỏ lỡ điều gì không?
Shaggy

@Shaggy Tôi cho rằng đó là "bất kỳ định dạng hợp lý" nào, tôi không nghĩ rằng chúng tôi có các mặc định liên quan đến việc nhập thẻ chơi.
Erik the Outgolfer 27/07/18

0

PHP , 264 byte

Nó Echos 1nếu nó là một tuôn thẳng và 0hay nullnếu không muốn nói.

Nếu bạn đặt tên cho tệp 1Xthì bạn có thể lưu 11 bytesvì bạn không cần thay đổi $argv[0]. Không chắc chắn tại thời điểm tại sao tên tệp có thể phá vỡ nó.

Vì một số lý do, các chuỗi :;<=>được sắp xếp trước các chuỗi 0123456789bằng asortTIO mặc dù :;<=>có các giá trị ASCII 58-62 và 0123456789có các giá trị ASCII 48-57. Vì vậy, nếu bạn lấy mã từ liên kết TIO hoặc bên dưới và sử dụng PHPTester với bộ kiểm tra sau, nó sẽ hoạt động.

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

Mã 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;

Hãy thử trực tuyến!


0

Kotlin , 226 byte

Được sử dụng T cho 10 nên tất cả các thẻ có độ dài 2 ký tự.

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

Hãy thử trực tuyến!


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.

Hãy thử trực tuyến!

Sử dụng Tcho 10. Đầu vào chứa 1 thẻ trên mỗi dòng.

Bây giờ tôi đã chơi nó nhiều đến mức tôi không biết nó hoạt động như thế nào nữa ...

Giải trình:

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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.