ブラックジャックバスト計算機


12

21としても知られるブラックジャックは、自分とディーラーのカードゲームを比較するもので、各プレイヤーは順番にディーラーと対戦しますが、プレイヤーはお互いに対戦しません。

プレイは次のように行われ、ディーラーはあなたにカードを配ります。次に、ディーラーは自分自身にカードを伏せて配ります。ディーラーはあなたに別のカードを配ります。そして最後に、ディーラーは自分自身にカードを表向きに配ります。

チャレンジ

あなたの課題は、ディーラーが与える次のカードが破産する確率を実行(または呼び出し)、出力(またはリターン)するプログラム(または関数)を書くことです。ディーラーから21枚以上の別のカードが渡されます。

入力

プレイ中の3枚の目に見えるカード。それらはあなたが手に持っている2枚のカードと、ディーラーの手にある1枚のフェイスカードです。これは、アプリケーションに適した任意の形式にすることができます。

デッキには52枚のカードがあります(以下の各カードのうち4枚)。カードの価値は次のとおりです。

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 

ブラックジャックでは、エースは1または11としてカウントできます。チャレンジでは、1としてのみカウントします。

出力

次のカードがドローする確率または割合の形式で、私たちはバストになります。

割合、分数、または分数の分子のみを出力できます。

この例では、最初の2枚のカードが手にあり、3枚目のカードはディーラーの目に見えるカードです。

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

ルール

標準の抜け穴は許可されていません。

これはなので、各言語のバイト単位の最短コードが勝ちです!


2
エースを1に、フェイスカードを10に設定することは許可されていますか?

だから、私たちは10としてフェイスカードを取ることができますか?
wastl

1
@Arnauldキャッチしてくれてありがとう。比率は更新しましたが、確率は更新しませんでした。あなたの出力の質問に関しては、それは問題ありません。各回答に/ 49を追加する必要はありません。
開発開発者

1
「TJK-> 91.84%または45/49 または45など...」-分子を単純に出力できますか?もしそうなら、テキストでそれを述べることができますか?
ジョナサンアラン

1
@JonathanAllan更新
開発中開発者

回答:


7

ゼリー 26  24 バイト

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

の分子(49 番目の数)を返す文字のリスト(1forで小文字オプションまたは大文字オプションのいずれかを使用)を受け入れるモナドリンク。A[0,49]

オンラインでお試しください!またはテストスイートを見る

どうやって?

小文字の最小値である10を使用すると、48を法とする序数がカードの値を与えることに注意してください。同じことは、大文字用保持TJQK及び1右側に示すように、ACEの(しかし大文字はA仕事をしません)。

     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テクノロジーを完全に盗もうとする誘惑が強まる
マジックタコ

私がmod-48を使用して答えを作成することになった場合、壮大な観察のために200を賞賛します。
魔法のタコ

4

JavaScript(ES6)、73 62バイト

1forエース付きの3文字の配列として入力を受け取ります。破壊される確率X / 49を表す整数Xを返します。

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

オンラインでお試しください!

徹底的なテスト

ゴルフのフォーミュラはあまり直感的ではありません。そのため、その一貫性を証明する最も簡単な方法は、おそらく、すべての可能な出力を基本的な未実装の実装によって提供される出力と比較することです。

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

オンラインでお試しください!


.map(n=>b-=n+b>52,b+=c-32)一般的に何をしますか?私は、JSのとあまり慣れていないんだ.map。最初、私はそれが短いの変種だけれども...とカンマがここで何をするか理解しようと.map(n=>{b-=n+b>52;b+=c-32})か、何か..私は知っているa=>([b,c]=a.map(v=>v*4||40))変換を['1','2','Q'][ 4, 8, 40 ]、そしてそれは、これらの3つの値をループし、どこb最初の値であります、およびc2番目です(正しく理解している場合)。しかし、私は少し混乱しています.map(n=>b+=(n+b<53)-1,b+=c-32)(最初のものb-=がに変更された場合b+=)対.map(n=>b+=(n+b<53)-33+c)..
ケビンクルーイッセン

うーん、それとも実際にb=最初の値、c=の2番目の値[4, 8, 40]、そして2回目の繰り返しの場合も同様にb-=n+b>52変更さcれますか?そのため、両方を1つ(または)に結合しても機能b-=しませんか?b+=b+=b-=
ケビンクルイッセン

1
@KevinCruijssenはのb+=c-32(未使用の)パラメーターでmap()あり、最初の反復の前に一度だけ評価されます。n=>b-=n+b>52はコールバック関数(の最初のパラメーターmap())であり、各反復で呼び出されます。技術的にmap()は、2番目のパラメーター(thisArgと呼ばれる)を受け入れますが、これはここでは無関係です。ループが始まる前にこのコードを実行するだけです。
アーナルド

1
@KevinCruijssen ここで何が起こっているかを示すいくつかのコードがあります。
アーナウルド

ああ、今ではすべてが理にかなっています。ありがとう!
ケビンCruijssen

2

Pyth、35バイト

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

入力を文字のリストとして(または文字列として)受け取ります。
ここで試してみてください

説明

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

Java 8、109バイト

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

@ArnauldのJavaScript(ES6)回答のポート。
3つの値を持つ文字配列として入力、Aces as '1'; 出力はの確率pですp/49

オンラインでお試しください。

説明:

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

05AB1E23 22 21バイト

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

オンラインでお試しください!

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.