Blackjack , juga dikenal sebagai dua puluh satu, adalah permainan kartu perbandingan antara Anda dan dealer, di mana setiap pemain bersaing melawan dealer, tetapi pemain tidak bermain melawan satu sama lain.
Mainkan berjalan sebagai berikut, dealer memberi Anda kartu. Dealer kemudian memberi mereka kartu, menghadap ke bawah. Dealer kemudian memberi Anda kartu lain. Lalu akhirnya, dealer memberi mereka kartu, menghadap ke atas.
Tantangan
Tantangan Anda adalah menulis sebuah program (atau fungsi) yang ketika dijalankan (atau dipanggil), mengeluarkan (atau mengembalikan) probabilitas bahwa kartu berikutnya yang diberikan dealer akan membuat Anda bangkrut, yang berarti skor kumulatif kartu di tangan Anda setelah dealer memberi Anda kartu lain lebih dari 21.
Memasukkan
Tiga kartu yang terlihat sedang dimainkan. Mereka adalah dua kartu yang Anda miliki di tangan Anda, dan satu kartu wajah yang dapat Anda lihat di tangan dealer. Ini bisa dalam format apa pun yang Anda temukan cocok untuk aplikasi Anda.
Ada 52 kartu dalam satu tumpukan (masing-masing 4 kartu di bawah). Nilai kartu adalah sebagai berikut:
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
Dalam Blackjack, kartu As dapat dihitung sebagai 1 atau 11. Dalam tantangan kami, hanya menghitung sebagai 1
Keluaran
Probabilitas, dalam format rasio atau persentase, bahwa kartu berikutnya yang kita gambar akan membuat kita bangkrut.
Anda dapat menampilkan persentase, fraksi, atau hanya pembilang fraksi.
Contohnya
Dalam contoh ini, dua kartu pertama ada di tangan kita, kartu ketiga adalah kartu terlihat dealer
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 ...
Aturan
Ini adalah kode-golf , jadi kode terpendek dalam byte untuk setiap bahasa menang!
sumber
Jawaban:
Jelly ,
2624 byteSebuah link monadik menerima daftar karakter (baik menggunakan opsi-huruf kecil OR opsi-huruf dengan
1
untukA
) yang mengembalikan pembilang (jumlah 49 th s) di[0,49]
.Cobalah online! Atau lihat test-suite
Bagaimana?
Perhatikan bahwa dengan menggunakan huruf kecil, minimum 10 dan modulo dengan 48 memberikan nilai kartu. Hal yang sama berlaku untuk huruf besar
T
,J
,Q
,K
dan1
untuk ace, seperti yang ditunjukkan di sebelah kanan (tapi-hurufA
tidak bekerja):sumber
JavaScript (ES6),
7362 byteMengambil input sebagai array 3 karakter dengan
1
untuk kartu As. Mengembalikan integer X yang menunjukkan probabilitas X / 49 untuk ditembus.Cobalah online!
Tes yang melelahkan
Formula golf tidak sangat intuitif. Jadi, cara termudah untuk membuktikan konsistensinya mungkin adalah dengan hanya membandingkan semua output yang mungkin dengan yang disediakan oleh implementasi dasar yang tidak disatukan:
Cobalah online!
sumber
.map(n=>b-=n+b>52,b+=c-32)
dilakukan secara umum? Saya tidak terlalu terbiasa dengan JS.map
dan mencoba memahami apa yang dilakukan oleh koma di sini .. Awalnya saya pikir ini adalah varian yang lebih pendek dari.map(n=>{b-=n+b>52;b+=c-32})
atau sesuatu .. Saya tahua=>([b,c]=a.map(v=>v*4||40))
konversi['1','2','Q']
ke[ 4, 8, 40 ]
, dan kemudian loop atas tiga nilai ini, di manab
adalah nilai pertama , danc
yang kedua (jika saya mengerti benar). Tapi saya agak bingung tentang.map(n=>b+=(n+b<53)-1,b+=c-32)
(jika yang pertamab-=
diubah menjadib+=
) vs.map(n=>b+=(n+b<53)-33+c)
..b
= nilai pertama,c
= nilai kedua[4, 8, 40]
, danb-=n+b>52
memodifikasic
juga jika iterasi kedua? Dalam hal menggabungkan keduab-=
danb+=
menjadi satub+=
(ataub-=
) tidak akan bekerja karena itu?b+=c-32
adalah parameter (tidak digunakan) darimap()
dan dievaluasi hanya sekali sebelum iterasi pertama.n=>b-=n+b>52
adalah fungsi callback (parameter 1map()
) dan dipanggil pada setiap iterasi. Secara teknis,map()
tidak menerima parameter ke-2 (disebut thisArg ), tetapi ini tidak relevan di sini: kami hanya ingin potongan kode ini dieksekusi sebelum loop dimulai.Pyth, 35 byte
Mengambil input sebagai daftar karakter (atau sebagai string).
Coba di sini
Penjelasan
sumber
Perl 5 , 115 byte
Cobalah online!
sumber
Python 2 ,
9796 byteCobalah online!
Mengambil string 3 karakter sebagai input, dengan '1' digunakan sebagai Ace. Mengembalikan pembilang.
sumber
Java 8, 109 byte
Port dari jawaban JavaScript (ES6) @Arnauld .
Input sebagai karakter-array dengan tiga nilai, Aces sebagai
'1'
; output adalah probabilitasp
dalamp/49
.Cobalah online.
Penjelasan:
sumber
05AB1E , 46 byte
Cobalah online!
Ini bisa dilakukan dengan lebih baik, mengerjakannya.
sumber
05AB1E ,
232221 byteCobalah online!
sumber