블랙 잭 흉상 계산기


12

21이라고도하는 블랙 잭 은 자신과 딜러 간의 비교 카드 게임으로, 각 플레이어는 딜러와 경쟁하지만 플레이어는 서로 경쟁하지 않습니다.

다음과 같이 플레이하면 딜러가 카드를 취급합니다. 그런 다음 딜러는 카드를 뒤집어 놓습니다. 그런 다음 딜러는 다른 카드를 제공합니다. 그런 다음 딜러는 카드를 앞면으로 처리합니다.

도전

당신의 도전은 실행 (또는 호출) 될 때 딜러가 당신에게 줄 다음 카드가 당신을 파산시킬 확률을 출력 (또는 리턴)하는 프로그램 (또는 함수)을 작성하는 것입니다. 딜러가 다른 카드가 21 세 이상임을 알려줍니다.

입력

눈에 보이는 3 장의 카드. 그것들은 당신이 당신의 손에 가지고있는 두 장의 카드이고, 당신이 딜러의 손에서 볼 수있는 하나의 얼굴 카드입니다. 응용 프로그램에 적합한 형식이 될 수 있습니다.

덱에는 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 등 ..."-간단히 분자를 출력 할 수 있습니까? 그렇다면 본문에 설명 할 수 있습니까?
Jonathan Allan

1
@JonathanAllan 업데이트
DevelopingDeveloper

답변:


7

젤리 ,  26  24 바이트

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

(소문자 옵션 OR와 대문자 옵션 중 하나를 사용하여 문자 목록 받아들이는 모나드 링크 1를 들어 A분자 (49의 수를 반환) 에들) [0,49].

온라인으로 사용해보십시오! 또는 시험 스위트를 참조하십시오

어떻게?

소문자를 사용하여 최소 10 을, 서수 모듈로 48을 사용하면 카드 값이 제공됩니다. 같은 상부 케이스를 위해 보유 T, J, Q, K1에이스 들어, 오른쪽 그림 (그러나 대문자 같이 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

에 유혹 플랫 아웃 모드-48 기술의 심화를 도용
매직 문어 항아리

내가 mod-48을 사용하여 대답을 끝내면 서사시 관찰을 위해 200을 기꺼이 바꿉니다.
매직 문어 Urn

4

자바 스크립트 (ES6), 73 62 바이트

1ace 와 함께 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

온라인으로 사용해보십시오!

철저한 테스트

골프 공식은 매우 직관적이지 않습니다. 따라서 일관성을 입증하는 가장 쉬운 방법은 가능한 모든 출력을 기본 ungolfed 구현에서 제공하는 출력과 비교하는 것입니다.

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-=그 때문에) 의지하지 일?
Kevin Cruijssen

1
@KevinCruijssen b+=c-32은 (사용되지 않은) 매개 변수이며 map()첫 번째 반복 전에 한 번만 평가됩니다. n=>b-=n+b>52콜백 함수 (의 첫 번째 매개 변수 map())이며 각 반복에서 호출됩니다. 기술적으로, map()두 번째 매개 변수 ( thisArg )를 허용하지만 여기서는 관련이 없습니다. 루프가 시작되기 전에이 코드 조각을 실행하려고합니다.
Arnauld

1
@KevinCruijssen 다음 은 진행중인 작업을 보여주는 코드입니다.
Arnauld

아 알았어, 이제 모든 게 말이 돼 감사!
Kevin Cruijssen 12

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

자바 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) 답변 포트 .
세 개의 값을 가진 문자형 배열로 입력, Ace는 '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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.