Bu dümdüz bir floş mu?


21

İlgili: Poker eli adı

Düz bir floş, hepsi aynı takımdan, beş sıralı sıralama kartı içeren bir poker elidir. Düz bir sifonun parçası olarak, bir as kralın üstünde veya ikisinin altında olabilir. Bir as, yüksek (örneğin A ♥ K ♥ Q ♥ J ♥ 10 ♥, bir as yüksek düz basma) veya düşük (örneğin 5 ♦ 4 ♦ 3 ♦ 2 ♦ A ♦, beş yüksek düz basma) olabilir, ancak aynı elinde hem yüksek hem de düşük rütbeli olamaz (örneğin, Q ♣ K ♣ A ♣ 2 ♣ 3 ♣, bir asa yıkamasıdır, düz bir yıkama değildir).

Meydan okuma

Verilen Nkartlar (herhangi bir makul formatta), pokerin elinde düz bir floş varsa, gerçek bir değer çıkarır.

Giriş

  • Nkartların sayısı. (Herhangi bir makul formatta)

Dört takım elbise var; kalpler, maçalar, elmaslar ve kulüpler (H, S, D, C).

Her takım elbisede 2 ile 10 arasında bir kart artı 4 adet "resim" kartı vardır, Ace, Jack, Queen ve King (A, J, Q, K)

Not: T olarak 10 alabilir

Çıktı

  • Truthy/Falsy değer

Test durumu

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

Standart kuralları geçerlidir.

Kazanan kriterler: Her dilde en kısa kod


1
Aynı karttan ikisinin elinde olmayacağını varsayabilir miyiz?
Jo King,

@JoKing evet, iki ya da daha fazla aynı karta sahip olmayacaksınız
Luis felipe De jesus Munoz

4
10Olarak alabilir miyiz T?
Kevin Cruijssen

@JoKing Bunun IRL olabileceğini sanmıyorum. ;-)
Outgolfer Erik,

4
@EriktheOutgolfer Kelimenin tam anlamıyla bir metre uzağında 5 paket karışık karttan daha azına sahibim
Jo King

Yanıtlar:


15

Python 2,95 bayt

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

Çevrimiçi deneyin!

40 tane düz basma kabiliyeti var ve bu hepsini kontrol ediyor. Chas Brown 2 bayt kurtardı; Jo King 4 tane daha kazandı.


1
40 vardır, kullanılan Adeğişiyorum inanıyorum böylece her iki uçta 36için 40bunu düzeltmek gerekir.
Jonathan Allan

Maalesef, saymakta iyi değilim. Düzelttim!
Lynn,


Uygun değer sırasını değiştirin ve if koşulunu dizine taşıyın mı?
Jo King,


8

R , 128 126 94 91 bayt

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

Çevrimiçi deneyin!

Orijinal mantık, @ J.Doe tarafından önemli ölçüde kısaldı.

Çoğunlukla saçma olan 26 x 26'lık bir matris yapar, ancak 3,4,8 ve 24 numaralı sütunların 10 ila 23'ünde bulunan tüm kartlar (Aslar altta tekrarlanır) matris, büyük harflerin tüm kombinasyonlarını birleştirerek oluşturulur J'den X'e kadar olan harfleri içeren alfabe A, 2-9, T, J, Q, K, A, S ile değiştirilir chartr. Bedava C, D, H alıyoruz!

%in%Bir vektöre kolon-bazlı bir matris düzleştirir. Ardından, TRUEeşleşme uzunluğu kodlamasının herhangi bir eşleşme koşulu için 4'ten büyük olup olmadığına bakın .


Zeki rleVE kullanımı outer! Bu iki bayt kazandırır
JayCe

94 bayt. İki değişiklik: outerbirçok geçersiz kart üreten simetrik bir çağrı kullanmak ve inönlemek için vektör zorlamasını kullanmak apply. Bunun çalışması için ikisinin de yerinde olması gerekiyor!
J.Doe

2
Çok hoş! Cevabı değiştirdi ve topluluk wiki yaptı.
NGM

5

JavaScript (ES6), 116 bayt

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)

Çevrimiçi deneyin!

Nasıl?

scsm


5
"Currying Notation" tanıtım hattınıza o kadar alıştım ki ihtiyaç olmadığında özlüyorum.
NGM

4

Brachylog , 31 bayt

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

Çevrimiçi deneyin!

 ᵍ                    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 bayt

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

Çevrimiçi deneyin! Açıklama:

J
11
Q
12
K
13

Resim kartlarını kendi değerlerine dönüştürün.

A
1$%'¶14

A 1 veya 14 olabilir.

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

Değeri unary değerine dönüştürün ve kartların uygun şekilde sıralanması için sonlandırın.

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

Her defasında 1 oranında artan 5 kartla eşleştirin ve son artışın tam olarak 1 olduğundan emin olun.


2

JavaScript (ES6), 106 bayt

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)

Yerine kartların dize temsilleri, bir dizi Kabul 10ile T. Çevrimiçi deneyin!

açıklama

Her kartın üzerinde tekrar eder ve kendi rütbesi ile takım elbisenin benzersiz kombinasyonundan hesaplanan bir indeksi kullanarak bir dizi booleanda bir bayrak belirler. Ardından, bu dizi 5 ardışık truthy değerinin bir deseninin eşleşmesine izin vermek için düzenlenir.

Örneğin, düz bir sifonlu bir el, aşağıdakileri boolean dizisinin tam dize gösteriminin bir alt dize olarak üretebilir: ,,,,1,1,1,1,1,,,,

İlk sıra değeri (yani A) dizgenin başlangıcından itibaren dengelendiğinden 1, dizgede gösterimin bir ile başlamasını sağlayacak şekilde dizideki her zaman önünde her zaman boş değerler olacaktır.,

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
Güzel. Bu, daha fazla oyu hakediyor, ancak millet ilk görevden birkaç gün sonra zorluklara olan ilgisini kaybetme eğiliminde.
Rick Hitchcock

2

Java 10, 189 167 165 164 160 157 156 bayt

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

Girdiyi tek boşlukla ayrılmış bir String (yani "AS 2S 3S 4S 5S") olarak alır.

@ OlivierGrégoire sayesinde -22 bayt . @AlexRacer
sayesinde -1 bayt .

Çevrimiçi deneyin.

Öncelikle regex'lerle yaptığım Project Euler # 54 için kullandığım kodun golf sürümü (eğlence ve regex'ler hakkında daha fazla bilgi edinmek için). Regexs olmadan muhtemelen performans için daha iyi ve daha kolay olurdu (muhtemelen bu cevabı golf için de geçerlidir; daha sonra bir göz atın).

Açıklama:

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)

Ek regex açıklaması:

  • "AKQJT98765432A".substring(i,i+5) dayalı beş bitişik kart alır i
  • .replaceAll(".","(?=.*$0\\\\1)")bu kartların her birini "(?=.*c\\1)"( ckart karakteri nerede ) değiştirir
  • .replaceFirst(".1","([HSDC])")sonra ilk \\1ile yerini alacak ([HSDC]).

Diğer bir deyişle, değer aralığında kartlar için Düz Flush'ı kontrol etmek için toplam regex [9,5]olur:
^(?=.*9([HSDC]))(?=.*8\\1)(?=.*7\\1)(?=.*6\\1)(?=.*5\\1).*$
(NOT: tüm String'i kontrol etmek için String#matchesizini / satırını kesin olarak ekler ^...$.) Bu 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 bayt . Regex neslini sadece golf oynamıştım: hala senin algoritmanın.
Olivier Grégoire

1
167 bayt . Gereksiz ".*"+öneki kaldırdım .
Olivier Grégoire

1
@ OlivierGrégoire Teşekkürler! Güzel golf
Kevin Cruijssen

1
-1 bayt yerine döngüden f
ayrılırsanız

1
@AlexRacer Smart, teşekkürler! Ve 2 daha değiştirerek bayt golf mümkün breakiçin i=-2ve dönüş return-1>i;yaklaşımınızı kullanarak (ve 2 daha değişen (.)etmek .ve $1için $0). :)
Kevin Cruijssen

1

Temiz , 145 135 bayt

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

Çevrimiçi deneyin!

Basitleştirilmiş:

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

2B dizi olarak giriş yapar.

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

Dene


açıklama

"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

Jöle , 18 bayt

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

Çevrimiçi deneyin!

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

Çıktı formatı: sahtekarlık olarak boş liste, truthy olarak boş olmayan liste.


Teknik özelliklerde tamsayıların kıyafetler ve resim kartları ile değiştirilebileceğini düşünen hiçbir şey görmüyorum - bir şey mi kaçırdım?
Shaggy,

@Shaggy Bunun “herhangi bir makul formatta” olduğunu varsayıyorum, iskambil kağıtlarına giriş ile ilgili varsayılanlarımız olduğunu sanmıyorum.
Outgolfer Erik,

0

PHP , 264 bayt

Bu echos 1düz bir hizada olup olmadığını 0veya nulldeğilse.

Dosyayı adlandırırsanız, değiştirmeniz gerekmediği için 1Xkaydedebilirsiniz . Şu anda dosya adının neden kırabildiğinden emin değilim.11 bytes$argv[0]

Nedense dizeleri :;<=>dizeleri önce sıralama olsun 0123456789tarafından asortrağmen TIO içinde :;<=>ASCII değerleri 58-62 ve 0123456789ASCII değerleri 48-57 sahiptir. Bu nedenle, kodu TIO bağlantısından veya altından alıyorsanız ve aşağıdaki test paketiyle PHPTester kullanıyorsanız işe yarar .

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

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;

Çevrimiçi deneyin!


0

Kotlin , 226 bayt

10 için T kullanılır, böylece tüm kartlar 2 karakter uzunluğunda olur.

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

Çevrimiçi deneyin!


0

Pascal (FPC) , 223 216 210 209 bayt

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.

Çevrimiçi deneyin!

Kullanımları T10. Girişi için her satıra 1 kart içerir.

Şimdi o kadar çok golf oynadım ki artık nasıl çalıştığını bilmiyorum.

Açıklama:

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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.