Badugi, Kim Kazanır?


9

Esinlenerek bu meydan ve ilgili bu bir .

Arka fon

Badugi [bæduːɡiː] düşük top çekilişli bir poker çeşididir.

Pokerstars Dünya Poker Of 1K Poker $ 1K etkinliği 3 saat içinde başlıyor ve ellerimin ne kadar iyi olduğunu bilmem gerekecek!

Oyun dört takım ve on üç sıra 52 karttan oluşan standart bir deste kullanır . Davetler sıralanmamıştır ve etiketlenecektir cdhs; - en yüksekten en Kdüşüğe doğru sıralanan A- dereceler KQJT98765432A. Bu nedenle, tam güverte aşağıdaki gibi temsil edilebilir (boşlukla ayrılmış):

Kc Kd Kh Ks Qc Qd Qh Qs Jc Jd Jh Js Tc Td Th Ts 9c 9d 9h 9s 8c 8d 8h 8s 7c 7d 7h 7s 6c 6d 6h 6s 5c 5d 5h 5s 4c 4d 4h 4s 3c 3d 3h 3s 2c 2d 2h 2s Ac Ad Ah As 

Her oyuncuya desteden dört kart dağıtılır , aralarında üç çizim turu olan dört bahis turu vardır (bir oyuncunun her zaman dört kartı vardır, her birinde dağıtıcıdan yenileriyle kartlarının 0-4'ünü değiştirme seçeneği vardır üç çizim turundan).

Eğer tüm bu turlardan sonra birden fazla oyuncu hala aktifse, bir hesaplaşma gerçekleşir, bunun üzerine en güçlü el (ler) bahisli bahisleri kazanır.

Oyun düşük topla oynanır, bu nedenle en düşük el kazanır ve yukarıda belirtildiği gibi A(ace) düşüktür. Ayrıca el sıralaması diğer poker türlerinden farklıdır ve yeni başlayanlar için biraz kafa karıştırıcı olabilir.

Oynanan "el", mümkün olan en yüksek sayıda "off-suit" (hepsi farklı) ve "off-rank" (tamamen farklı derecelerde) kartlardan (tutulan dört karttan) yapılan en düşük sıralama kombinasyonudur. ). Yani, eğer biri farklı takımlardan ve farklı derecelerden dört kart tutarsa , kişinin 4 kartlı bir eli vardır ("badugi" olarak adlandırılır); bir 4-kart ele sahip ama bazı seti veya farklı takım elbise hem üç kartlarının setleri var yoksa ve ayrı sıralarında bir 3 kartlık eli (bir onların en iyi seçer); biri 4-kartlı el veya 3-kartlı bir ele sahipse, muhtemelen 2-kartlı bir ele sahiptir, ancak değilse 1-kartlı bir ele sahiptir.

  • Mümkün olan en iyi el 4 kartlı eldir 4-3-2-A- genellikle "1 numara" olarak adlandırılan dört farklı takımın en düşük sıra dışı kartlarıdır . Mümkün olan en zayıf el 1-kartlı el olabilir ve sadece tam olarak tutarak mümkündür .KKc Kd Kh Ks

  • Not 4c 3h 2c Asolduğu değil , çünkü bir "sayı-1" 4cve 2caynı renkten, ama bir 3-kart ellerin güçlü, 3-2-Abu diğer çizer 3-2-1(gibi s Kh 3d 2s Ah) ve diğer tüm 3-kart elleri yener ama tüm 4 kartlı ellere kaybeder (ki bu kadar zayıf olabilir K-Q-J-T).

    • İmal edilebilir Diğer olası 3-kartlı el 4c 3h 2c Asolan 4-3-A, ama bu şekilde seçilir değil (daha yüksek) daha zayıftır.
  • Benzer şekilde 8d 6h 3s 2h3 kartlı bir el de oynanır 8-3-2- 3 boyutlu iki sıra dışı takım elbise kombinasyonu vardır ve üç (veya "trey") altıdan daha düşük olduğundan 8-3-2daha iyidir (daha düşük) 8-6-3.

Ellerin birbiriyle karşılaştırılması aynı mantığı takip eder - herhangi bir 4 kart herhangi bir 3 kartı, herhangi bir 3 kart herhangi bir 2 kartı ve herhangi bir 2 kartı 1 kartı yener, aynı sayıda kullanılmış kartın elleri (örneğin: düşük seviyesine en yüksek rütbe menüden karşılaştırıldığında 8-4-2yener 8-5-Aancak herhangi birinin 8-4-A, 8-3-2ya da 7-6-5)

Meydan okuma:

Dört kartın her birinde iki sıralanmamış koleksiyon verildiğinde, Badugi hesaplaşmasını kazananları belirleyin (her ikisinin de berabere olup olmadığını belirleyin).

Girdi makul bir şey olabilir:

  • sol dört bir el ve diğer sağ (isteğe bağlı bir ayırıcı ile) olacak şekilde yukarıda etiketlenmiş (boşluklu veya boşluksuz) sekiz kartın hepsinden oluşan tek bir dizi; veya aynı tarzdaki karakterlerin bir listesi
  • iki dize listesi - her el için bir tane veya aynı şekilde karakter listelerinin listesi
  • her biri bir tane olmak üzere iki ayrı dize veya liste girişi
  • ellerde bulunan kartlar da zaten ayrılmış olabilir (bu nedenle liste listelerinin listesi iyidir)

Ancak not:

  • kartlar girişten önce herhangi bir sıraya göre düzenlenemez
  • ... ve takım elbise ve dereceler burada belirtilen karakter etiketleri olarak sabitlenir - Diliniz bu tür yapıları desteklemiyorsa, makul bir şey önerin ve dil kısıtlamalarınız göz önüne alındığında kabul edilebilir bir alternatif olup olmadığını sorun.

Çıktı ya

  • girişle aynı şekilde biçimlendirilmiş veya basılı bir gösterimi; veya
  • (: örneğin üç ayrı ve tutarlı sonuçlar biri "left", "right", "both"ya da 1, 2, 3; vs.)

Gerçekten - iki girişten hangisinin tanımlandığı açık olduğu sürece, iyi olmalıdır.

Test senaryoları

input                      ->  output
                                   (notes)
----------------------------------------------------------------------------
3c 2s 4d Ah - As 3h 2d 4h  ->  3c 2s 4d Ah
                                   (4-card 4-3-2-A beats 3-card 3-2-A)

3c 2s 4d Ah - As 2c 3d 4h  ->  3c 2s 4d Ah - As 2c 3d 4h
                                   (4-card 4-3-2-A draws with 4-card 4-3-2-A)

2d Ac 4h 3c - Kh Ad 9s 2c  ->  Kh Ad 9s 2c
                                   (3-card 4-2-A loses to 4-card K-9-2-A)

Kc Tc Qc Jc - Ac Ad Ah As  ->  Ac Ad Ah As
                                   (1-card T loses to 1-card A)

9c 9h Qc Qh - Qs Kh Jh Kd  ->  Qs Kh Jh Kd
                                   (2-card Q-9 loses to 3-card K-Q-J)

2d 5h 7c 5s - 2h 3c 8d 6c  ->  2d 5h 7c 5s
                                   (3-card 7-5-2 beats 3-card 8-3-2)

3s 6c 2d Js - 6h Jd 3c 2s  ->  6h Jd 3c 2s
                                   (3-card 6-3-2 loses to 4-card J-6-3-2)

Ah 6d 4d Ac - 3h 2c 3s 2s  ->  3h 2c 3s 2s
                                   (2-card 4-A loses to 2-card 3-2)

2h 8h 6h 4h - 6d 2d 5d 8d  ->  2h 8h 6h 4h - 6d 2d 5d 8d
                                   (1-card 2 = 1-card 2)

Bu , bayt cinsinden en kısa kod dil başına ve genel olarak en kısa kod kazanır. Golf dillerinin sizi diğer dillerde göndermenize izin vermeyin ve ... eğlenin!


[['3c', '2s', '4d', 'Ah'], ['As', '3h', '2d', '4h']]Makul bir şey mi?
Outgolfer Erik

@EriktheOutgolfer Evet - Sadece öne ekleyebileceğinizi düşünüyorum diyecektim O.
Jonathan Allan

Yanıtlar:


2

Perl 6 , 128 bayt

{.map({.combinations(1..4).grep({!.join.comb.repeated}).map({-$_,$_».trans('ATK'=>'1BZ')».ord.sort(-*)}).min}).minpairs».key}

Çevrimiçi deneyin!

Dizeler gibi kartların listesi olan ellerin bir listesini (ikiden fazla) alır Kc. En düşük puana sahip ellerin endekslerini verir. İki el (0)için ilk el kazanırsa, (1)ikinci el kazanırsa ve (0, 1)berabere kalır .

Açıklaması:

{
    # Map hands to best "played hand".
    .map({
        # Generate all combinations of length 1 to 4.
        .combinations(1..4)
        # Remove hands with repeated characters.
        .grep({!.join.comb.repeated})
        # Map to a cmp-arable representation. This works because
        # lists are compared element-wise. Translate some characters
        # so that ASCII order works. Sort in reverse order so that
        # element-wise comparison will go from highest to lowest.
        .map({ -$_, $_».trans('ATK'=>'1BZ')».ord.sort(-*) })
        # Find best hand.
        .min
    })
    # Return indices of lowest scoring hands. It's a shame that
    # `minpairs` doesn't support a filter like `min`.
    .minpairs».key
}

İlgi <...>çekmemek için test kemerinizde bir dizi listesine nasıl tercüme edilir? İçeriğin mekanlara bölünmesi gerektiğini söyleyen bir çeşit şeker mi?
Jonathan Allan

@JonathanAllan Bu Perl'in kelime alıntısı . Perl 6 , Perl 5'e <a b c>ek olarak desteklerqw(a b c)
nwellnhof

Bu kendi içinde güzel ve golf :)
Jonathan Allan

2

JavaScript (ES6), 209 202 192 182 181 bayt

@Neil sayesinde 7 bayt kaydedildi

Girdi dizgiler dizisi dizisi olarak alır. İade trueilk elden, kazanırsa falseikinci el kazanır eğer veya 2bir kravat durumunda.

a=>([a,b]=a.map(a=>a.reduce((a,x)=>[...a,...a.map(y=>[x,...y])],[[]]).map(a=>!/(\w).*\1/.test(a)*a.length+a.map(a=>'KQJT98765432A'.search(a[0])+10).sort()).sort().pop()),a==b?2:a>b)

Test senaryoları

Nasıl?

a => (
  // store the best combination for both hands in a and b respectively
  [a, b] = a.map(a =>
    // compute the powerset of the hand
    a.reduce((a, x) => [...a, ...a.map(y => [x, ...y])], [[]])
    // for each entry:
    .map(a =>
      // invalidate entries that have at least 2 cards of same rank or same value
      !/(\w).*\1/.test(a) *
      // the score of valid entries is based on their length ...
      a.length +
      // ... and their card values, from highest to lowest
      // (we map 'KQJT98765432A' to [10 - 22], so that the resulting
      // strings can be safely sorted in lexicographical order)
      a.map(a => 'KQJT98765432A'.search(a[0]) + 10).sort()
    )
    // keep the best one
    .sort().pop()
  ),
  // compare a with b
  a == b ? 2 : a > b
)

Buna ihtiyacın var joinmı?
Neil

1

Jöle , 36 bayt

ẎŒQȦ;L;Ṗ€Ṣ$
“A+KYTE”yḲONŒPÇ€ṢṪµ€⁼€Ṁ$

İki karakter listesinin bir listesini alan bir monadik bağlantı
- her biri elin boşlukla ayrılmış bir temsilidir (örn. "Ac 2d 4s 3h")
Kazanan (lar) ı 1ve herhangi bir kaybeden ile tanımlayan iki sayının listesini döndürerek 0
- ie [1, 0]= sol kazançları; [0, 1]= sağ kazanç;[1, 1]= çiz.

Çevrimiçi deneyin! veya test takımına bakın .

Nasıl?

ẎŒQȦ;L;Ṗ€Ṣ$ - Link 1, sortKey: list of lists of numbers representing some cards (see Main)
Ẏ           - flatten into a single list of numbers
 ŒQ         - distinct sieve (1 at first occurrence of anything, 0 at the rest)
   Ȧ        - Any & All? zero if any are 0 or if empty; 1 otherwise (i.e. playable hand?)
     L      - length of input (number of cards in the hand)
    ;       - concatenate
          $ - last two links as a monad:
       Ṗ€   -   pop each (get just the rank portions)
         Ṣ  -   sort (Main's translation & negation of ordinals ensures A>2>3>...>Q>K)
      ;     - concatenate (now we have [isPlayable; nCards; [lowToHighCards]])

“A+KYTE”yḲONŒPÇ€ṢṪµ€⁼€Ṁ$ - Main link: list of lists of characters, hands
                  µ€     - for €ach of the two hands:
“A+KYTE”                 -   literal list of characters "A+KYTE" (compressing doesn't help - lower case would be “£Ḅṁ⁽>» though -- I'll stick with kyte though it's kind of nice.)
        y                -   translate - change As to +s, Ks to Ys and Ts to Es
                         -               note the ranks are now in ordinal order:
                         -               +<2<3<4<5<6<7<8<9<E<J<Q<Y
         Ḳ               -   split at spaces - split the four cards up
          O              -   to ordinals '+'->43, '2'->50, ...
           N             -   negate - effectively reverse the ordering
            ŒP           -   power-set - get all combinations of 0 to 4 cards inclusive
              Ç€         -   call the last link (1) as a monad for €ach such selection
                Ṣ        -   sort these keys
                 Ṫ       -   tail - get (one of) the maximal keys
                         -                       (the key of a best, playable selection)
                       $ - last two links as a monad:
                      Ṁ  -   maximum (the better of the two best, playable selection keys)
                    ⁼€   -   equals? for €ach (1 if the hand is a winner, 0 if not)

1

Python 3 , 207 204 bayt

lambda i,j:L(h(i))-L(h(j))if L(h(i))!=L(h(j))else(h(i)<h(j))-(h(i)>h(j))
L=len
def h(l):s=set();return[x[0]for x in sorted(y.translate({65:49,75:90,84:65})for y in l)if not(s&set(x)or s.update(*x))][::-1]

Çevrimiçi deneyin!

Jonathan Frech sayesinde 3 bayt kurtardı

İade 1durumunda ilk elden kazanç, -1ikinci el kazanır ve eğer 0beraberlik durumunda.

İşlev h, eli temsil eden bir liste hesaplar.

Lambda elin iki temsilini karşılaştırır. Kısaltılmış olabileceğini düşünüyorum, ancak sadece üç değer döndürmek istedim ve karşılaştırma yapmak için daha basit bir yol bulamadım.


Sen tanımlayarak iki bayt kaydedebilir L=lenve diğer tüm tekrarlarını değiştirmek lenile L.
Jonathan Frech

Ayrıca, muhtemelen yerini alabilir s=set()ile s={0}ve set(x)&s oriles&set(x)or
Jonathan Frech
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.