Blackjack Göğüs Hesaplayıcı


12

Yirmi bir olarak da bilinen Blackjack , kendiniz ve bir krupiye arasında, her oyuncunun krupiyeye karşı yarıştığı ancak oyuncuların birbirlerine karşı oynamadığı bir karşılaştırma kart oyunudur.

Oyun aşağıdaki gibi gider, dağıtıcı size bir kart dağıtır. Krupiye daha sonra kendilerine bir kart kapalı olarak dağıtır. Krupiye size başka bir kart dağıtır. Sonunda, dağıtıcı onlara bir kart, açık olarak dağıtır.

Meydan okuma

Zorluğunuz, dağıtıldığında (veya çağrıldığında), krupiyenin size vereceği bir sonraki kartın sizi iflas etme olasılığını ortaya çıkaran (veya geri döndüren) bir program (veya işlev) yazmaktır. Dağıtıcı size 21'in üzerinde başka bir kart verir.

Giriş

Oyundaki üç görünür kart. Bunlar elinizde bulunan iki kart ve bayilerin elinde görebileceğiniz bir yüz kartıdır. Bu, uygulamanız için uygun bulduğunuz biçimde olabilir.

Bir destede 52 kart vardır (aşağıdaki kartların her birinin 4'ü). Kartların değeri aşağıdaki gibidir:

Symbol(Case Insensitive)  Name     Value
2                         Two      2
3                         Three    3
4                         Four     4
5                         Five     5
6                         Six      6
7                         Seven    7
8                         Eight    8
9                         Nine     9
T                         Ten      10
J                         Jack     10
Q                         Queen    10
K                         King     10
A or 1                    Ace      1 

Blackjack'te, bir as 1 veya 11 olarak sayılabilir. Bizim mücadelemizde, sadece 1 olarak sayın.

Çıktı

Oran veya yüzde biçiminde, çizdiğimiz bir sonraki kartın bizi baskı altına alma olasılığı.

Yüzde, kesir veya sadece kesirin payını çıkarabilirsiniz.

Örnekler

Bu örnekte, ilk iki kart elimizde, üçüncü kart satıcıların görünür kartı

 Input          ->       Output

 A 2 Q          ->       0.00%  or  0/49 or 0
 A 2 3          ->       0.00%  or  0/49 or 0
 T T T          ->       91.84% or 45/49 or 91.84 
 T J K          ->       91.84% or 45/49 or 45
 9 7 3          ->       61.22% or 30/49 ...
 9 7 Q          ->       59.18% or 29/49 ...

kurallar

Standart boşluklara izin verilmez.

Bu , bu yüzden her dil için bayt olarak en kısa kod kazanır!


2
Ası 1 ve yüz kartları 10s olarak almamıza izin verilir mi, yoksa giriş formatını çok uzatabilir mi?

Yüz kartlarını 10 olarak alabilir miyiz?
Wastl

1
@Arnauld Yakaladığınız için teşekkür ederim. Oranları güncelledim ama olasılıkları değil. Çıktı sorunuza gelince, bu iyi. Her cevaba / 49 eklemeniz gerekmez.
DevelopingDeveloper

1
"TJK ->% 91.84 veya 45/49 veya 45 veya benzeri ..." - payınızı çıkartabilir miyiz? Eğer öyleyse bunu metinde söyleyebilir misiniz?
Jonathan Allan

1
@JonathanAllan Güncellendi
Geliştirme

Yanıtlar:


7

Jöle ,  26  24 bayt

O%48«⁵µ13R«⁵ẋ4œ-+ṖS$>21S

(Küçük harfle seçeneği YA ile büyük harf seçeneğini kullanarak karakterlerin bir listesini kabul Bir monadic bağlantı 1için Anumaralayıcısını (49 sayı döndürür) inci içinde s) [0,49].

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

Nasıl?

Küçük harf kullanarak minimum 10 ve ordinals modulo 48 kart değerlerini verir. Aynı üst vaka için geçerlidir T, J, Q, Kve 1bir as için, sağda gösterilen (ancak bir harf olarak Açalışmıyor):

     card:   a   2   3   4   5   6   7   8   9   t   j   q   k   |   1   T   J   Q   K
  ordinal:  97  50  51  52  53  54  55  56  57 116 106 113 107   |  49  84  74  81  75
   mod 48:   1   2   3   4   5   6   7   8   9  20  10  17  11   |   1  36  26  33  27
min(_,10):   1   2   3   4   5   6   7   8   9  10  10  10  10   |   1  10  10  10  10

O%48«⁵µ13R«⁵ẋ4œ-+ṖS$>21S - Link: list of characters   e.g. "q3a"
O                        - ordinals (of the input list)    [113, 51, 97]
 %48                     - modulo by 48                    [17,3,1]
     ⁵                   - ten
    «                    - minimum                         [10,3,1]
      µ                  - start a new monadic chain
       13R               - range of 13                     [1,2,3,4,5,6,7,8,9,10,11,12,13]
           ⁵             - ten                             10
          «              - minimum                         [1,2,3,4,5,6,7,8,9,10,10,10,10]
            ẋ4           - repeat four times               [1,2,3,4,5,6,7,8,9,10,10,10,10,1,2,3,4,5,6,7,8,9,10,10,10,10,1,2,3,4,5,6,7,8,9,10,10,10,10,1,2,3,4,5,6,7,8,9,10,10,10,10]
              œ-         - multi-set difference            [1,2,3,4,5,6,7,8,9,10,10,10,10,1,2,3,4,5,6,7,8,9,10,10,10,10,1,2,3,4,5,6,7,8,9,10,10,10,10  ,2  ,4,5,6,7,8,9   ,10,10,10]
                   $     - last two links as a monad:
                 Ṗ       -   pop                           [10,3]
                  S      -   sum                           13
                +        - add (vectorises)                [14,15,16,17,18,19,20,21,22,23,23,23,23,14,15,16,17,18,19,20,21,22,23,23,23,23,14,15,16,17,18,19,20,21,22,23,23,23,23,15,17,18,19,20,21,22,23,23,23]
                    >21  - greater than 21?                [0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1]
                       S - sum                             19

mod-48 teknolojisini
Magic Octopus Urn

Eğer mod-48 kullanarak cevap verirsem destansı gözlem için 200 tane kazanıyorum.
Sihirli Ahtapot Urn

4

JavaScript (ES6), 73 62 bayt

1Aslarla birlikte 3 karakterlik bir dizi olarak girdi alır . Bozulma X / 49 olasılığını temsil eden X tamsayısını döndürür .

a=>([b,c]=a.map(v=>v*4||40)).map(n=>b-=n+b>52,b+=c-32)|b>12&&b

Çevrimiçi deneyin!

Kapsamlı test

Golf formülü çok sezgisel değil. Bu nedenle, tutarlılığını kanıtlamanın en kolay yolu muhtemelen tüm olası çıktıları basit bir temelsiz uygulama tarafından sağlananlarla karşılaştırmaktır:

g = a => {
  deck = [...'123456789TJQK'.repeat(4)];
  a.forEach(card => deck.splice(deck.indexOf(card), 1));

  return deck.filter(card =>
    (+a[0] || 10) +
    (+a[1] || 10) +
    (+card || 10) > 21
  ).length;
}

Çevrimiçi deneyin!


Genel olarak ne yapar .map(n=>b-=n+b>52,b+=c-32)? Ben JS en çok aşina değilim .mapo daha kısa bir varyantı olsa Başlangıçta ben .. ve virgül burada ne yaptığını anlamaya çalışan .map(n=>{b-=n+b>52;b+=c-32})falan .. Biliyorum a=>([b,c]=a.map(v=>v*4||40))dönüştürür ['1','2','Q']için [ 4, 8, 40 ], ve sonra şu üç değerlerin üzerinde döngüler, nerede bilk değerdir , ve cikincisidir (doğru anlarsam). Ama vs .map(n=>b+=(n+b<53)-1,b+=c-32)( biraz ilk b-=değiştirilirse b+=) hakkında biraz kafam karıştı .map(n=>b+=(n+b<53)-33+c)..
Kevin Cruijssen

Ha ya da gerçekten de bilk değer, = c= ikinci değer [4, 8, 40], ve b-=n+b>52değiştirir cikinci yineleme herkesçe gibi? Böyle bir durumda, her iki birleştirme b-=ve b+=tek olarak b+=(ya da b-=bu nedenle), sadece iş?
Kevin Cruijssen

1
@KevinCruijssen b+=c-32, (kullanılmayan) bir parametredir map()ve ilk yinelemeden önce yalnızca bir kez değerlendirilir. n=>b-=n+b>52geri arama işlevidir (ilk parametresi map()) ve her yinelemede çağrılır. Teknik olarak, map()ikinci bir parametreyi ( thisArg olarak adlandırılır ) kabul eder , ancak bu burada önemsizdir: sadece döngü başlamadan önce bu kod parçasının yürütülmesini istiyoruz.
Arnauld

1
@KevinCruijssen İşte neler olduğunu gösteren bir kod.
Arnauld

Ah tamam, şimdi hepsi mantıklı. Teşekkürler!
Kevin Cruijssen

2

Pyth, 35 bayt

Jm?}dGTsdQclf>T-21sPJ.-*4+ST*3]TJ49

Girdiyi karakter listesi (veya dize) olarak alır.
Burada deneyin

açıklama

Jm?}dGTsdQclf>T-21sPJ.-*4+ST*3]TJ49
Jm?}dGTsdQ                            Convert each input to the appropriate number.
                     .-*4+ST*3]TJ     Remove each from the deck.
           lf>T-21sPJ                 Count how many remaining cards bust.
          c                      49   Get the probability.


1

Python 2 , 97 96 bayt

def f(s):C=[min(int(c,36),10)for c in s];D=C[0]+C[1];return(4*D-35+sum(v+D<22for v in C))*(D>11)

Çevrimiçi deneyin!

Giriş olarak 3 karakterlik bir dize alır ve '1' Ace olarak kullanılır. Payı döndürür.


1

Java 8, 109 bayt

a->{int r=3;for(;r-->0;a[r]=a[r]<59?a[r]*4-192:40);r=a[0]+a[1]-32;for(int v:a)r-=v+r>52?1:0;return r>12?r:0;}

Port of @Arnauld JavaScript (ES6) yanıtı .
Üç değerli karakter dizisi olarak girin, As olarak '1'; çıkış olasılığı polarak p/49.

Çevrimiçi deneyin.

Açıklama:

a->{                   // Method with integer-array as parameter and integer return-type
  int r=3;for(;r-->0;  //  Loop over the array
    a[r]=a[r]<59?      //   If the current item is a digit:
          a[r]*4-192   //    Multiply it by 4
         :             //   Else:
          40);         //    Change it to 40
  r=a[0]+a[1]-32;      //  Set `r` to the first value, plus the second value, minus 32
  for(int v:a)         //  Loop over the now modified array again
    r-=v+r>52?         //   If the current value plus `r` is larger than 52
        1              //    Decrease the result-integer by 1
       :0;             //   Else: Leave the result-integer the same
  return r>12?         //  If the result-integer is larger than 12
          r            //   Return the result-integer
         :             //  Else:
          0;}          //   Return 0


1

05AB1E , 23 22 21 bayt

AST:4-D¨OÐ4@*4*Š+T@O-

Çevrimiçi deneyin!

AST:                   # replace all letters in the input with 10
    4-                 # subtract 4 from each card value
      D                # duplicate
       ¨               # drop the last element
        O              # sum (hand value of the player - 8)
         Ð             # triplicate that
          4@*          # set to 0 if it's less than 4
             4*        # multiply by 4
               Š       # 3-way swap
                +      # add the player's hand value to each card value
                 T@O   # count how many are >= 10
                    -  # subtract
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.