เครื่องคิดเลขแบล็คแจ็อก


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 ได้?
กำจัด

1
@Arnauld ขอบคุณสำหรับการจับ ฉันอัปเดตอัตราส่วน แต่ไม่ใช่ความน่าจะเป็น สำหรับคำถามที่ส่งออกของคุณตะโกนว่าไม่เป็นไร คุณไม่จำเป็นต้องเพิ่ม / 49 ในแต่ละคำตอบ
กำลังพัฒนาผู้พัฒนา

1
"TJK -> 91.84% หรือ 45/49 หรือ 45หรืออื่น ๆ ... " - ดังนั้นเราอาจจะเอาท์พุดเศษ? ถ้าเป็นเช่นนั้นคุณสามารถระบุไว้ในข้อความได้หรือไม่
Jonathan Allan

คำตอบ:


7

เจลลี่ ,  26  24 ไบต์

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

การเชื่อมโยงเอกยอมรับรายการของตัวอักษร (โดยใช้ตัวเลือกกรณีที่ต่ำกว่าหรือตัวเลือกบนกรณีมี1สำหรับA) ซึ่งผลตอบแทนเศษ (จำนวน 49 TH s) [0,49]ใน

ลองออนไลน์! หรือดูชุดทดสอบ

อย่างไร?

โปรดทราบว่าโดยใช้ตัวพิมพ์เล็กขั้นต่ำ10และลำดับโมดูโลแบบ48ให้ค่าบัตร ตัวยึดที่เหมือนกันสำหรับตัวพิมพ์Tใหญ่J, และQ, สำหรับเอซตามที่แสดงทางด้านขวา (แต่ตัวพิมพ์ใหญ่ใช้งานไม่ได้):K1A

     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 ทวีความรุนแรง
Magic Octopus Urn

หากฉันต้องการคำตอบโดยใช้ mod-48 ฉันจะให้รางวัลคุณ 200 สำหรับการสังเกตอันยิ่งใหญ่
Magic Octopus Urn

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

ลองออนไลน์!

การทดสอบอย่างละเอียด

สูตร golfed ไม่ได้ใช้งานง่ายมาก ดังนั้นวิธีที่ง่ายที่สุดในการพิสูจน์ความสอดคล้องของมันก็อาจจะเป็นเพียงการเปรียบเทียบผลลัพธ์ที่เป็นไปได้ทั้งหมดกับสิ่งที่ได้รับจากการใช้งานขั้นพื้นฐานที่ไม่ดี

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+=) VS .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เป็นฟังก์ชั่นการโทรกลับ (พารามิเตอร์ที่ 1 ของmap()) และถูกเรียกในการทำซ้ำแต่ละครั้ง ในทางเทคนิคmap()ยอมรับพารามิเตอร์ตัวที่ 2 (เรียกว่าthisArg ) แต่สิ่งนี้ไม่เกี่ยวข้องที่นี่: เราแค่ต้องการให้โค้ดชิ้นนี้ถูกประมวลผลก่อนที่ลูปจะเริ่ม
Arnauld

1
@KevinCruijssen นี่คือรหัสบางส่วนที่แสดงว่าเกิดอะไรขึ้น
Arnauld

อาตกลงตอนนี้มันก็สมเหตุสมผลแล้ว ขอบคุณ!
Kevin 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) คำตอบของ
อินพุตเป็นอักขระอาร์เรย์ที่มีสามค่า Aces as '1'; เอาท์พุทคือความน่าจะเป็นในpp/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.