Калькулятор бюста Блекджека


12

Блекджек , також відомий як двадцять один, - це порівняльна карткова гра між собою та дилером, де кожен гравець по черзі конкурує проти дилера, але гравці не грають один проти одного.

Гра відбувається наступним чином, дилер передає вам карту. Потім дилер роздає їм - собі карту, обличчям вниз. Потім дилер передає вам іншу карту. Потім, нарешті, дилер роздає їм-собі карту, обличчям вгору.

Виклик

Ваше завдання полягає в тому, щоб написати програму (або функцію), яка при запуску (або виклику) видає (або повертає) ймовірність того, що наступна картка, яку надає вам дилер, змусить вас розбитися, що означає накопичувальну кількість карт у вашій руці після дилер надає вам ще одну карту старше 21 року.

Вхідні дані

Три видимі карти в грі. Це дві картки, які ви маєте в руці, і одна картка обличчя, яку ви можете побачити в дилері. Це може бути в будь-якому форматі, який ви вважаєте підходящим для вашої заявки.

У колоді 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

Вихідні дані

Ймовірність, у співвідношенні чи відсотковому форматі, що наступна картка, яку ми намалюємо, змусить нас розрушити.

Ви можете вивести відсоток, дріб або просто чисельник дробу.

Приклади

У цьому прикладі перші дві картки у нас в руці, третя карта - це видима карта дилерів

 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 у кожній відповіді.
DevelopingDeveloper

1
"TJK -> 91,84% або 45/49, 45 чи тощо ..." - тож ми можемо просто вивести чисельник? Якщо так, ви могли б це викласти у тексті?
Джонатан Аллан

1
@JonathanAllan Оновлено
DeveloperDeveloper

Відповіді:


7

Желе ,  26  24 байт

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

Монадічне посилання, що приймає список символів (використовуючи нижній регістр, АБО верхній регістр із 1 за» A), який повертає чисельник (число 49- го с) [0,49].

Спробуйте в Інтернеті! Або подивіться тестовий набір

Як?

Зауважте, що, використовуючи малі регістри, мінімум 10 та порядковий модуль на 48 дають значення картки. Те ж саме справедливо для верхнього регістру T, J, Q, Kі 1для асі, як показано праворуч (але символ верхнього регістру 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 байт

Вводить введення як масив з 3 символів з 1для тузів. Повертає ціле число X, що відображає ймовірність X / 49, яку потрібно покласти.

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 ], а потім він перетинає ці три значення, де bперше значення , і cє другим (якщо я правильно розумію). Але я трохи заплутався про те .map(n=>b+=(n+b<53)-1,b+=c-32)(якщо перший b-=буде змінений b+=) проти .map(n=>b+=(n+b<53)-33+c)..
Кевін Cruijssen

Хм, чи це дійсно b= перше значення, c= друге значення в [4, 8, 40], а також b-=n+b>52модифікується c, якщо це друга ітерація? У такому випадку поєднання обох b-=і b+=в єдине b+=(або b-=) через це не вийде?
Кевін Круїссен

1
@KevinCruijssen b+=c-32- це (невикористаний) параметр map()і оцінюється лише один раз перед першою ітерацією. n=>b-=n+b>52є функцією зворотного виклику (1-й параметр map()) і викликається на кожній ітерації. Технічно map()він приймає другий параметр (званий thisArg ), але це не має значення: ми просто хочемо, щоб цей фрагмент коду був виконаний до початку циклу.
Арнольд

1
@KevinCruijssen Ось код, який показує, що відбувається.
Арнольд

Ну добре, зараз це має сенс. Дякую!
Кевін Круїссен

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) відповідь «s .
Введіть як масив символів з трьома значеннями, 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

05AB1E , 23 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.