Pyth, 73 byte
eo_S+*-5l@\AN}SPMJ+NZSM.:+\AT5+-4l{eMJlM.gPkJ-sM*=T+`M}2Tc4"JQKA""hscd"=Zc
Ini sangat mengerikan. Mem-parsing kartu, menyortir nilai-nilai, ... Semuanya membutuhkan banyak karakter. Tapi pendekatannya menarik.
Cobalah online: Demonstrasi atau Test Suite
Penjelasan:
Saya menghasilkan semua 52 kartu, mengeluarkan empat kartu dari input, menghasilkan skor untuk setiap kartu (skor tangan), dan mencetak kartu dengan skor maksimal.
Skornya sedikit aneh. Jika saya membandingkan skor dua tangan yang sama sekali berbeda, itu mungkin memilih pemenang yang salah. Misalnya lurus akan mengalahkan 4 ace. Tapi berhasil, jika 4 kartu pertama sama di kedua tangan. Dan skor saya yang dihitung sebenarnya bukan nilai, tetapi daftar nilai:
- G: Pertama saya mengelompokkan 5 kartu berdasarkan peringkat dan mengambil panjang:
5h 5d 6c 5s Jd
->
[3, 1, 1]
- F: Lalu saya tambahkan 4 dikurangi jumlah suite yang berbeda ke daftar ini.
Flush
->
3
akan ditambahkan, not flush
->
2/1/0
akan ditambahkan.
- S: Tambahkan nomor lain.
0
jika tidak lurus, 4
jika lurus A2345
, atau 5
jika lurus lebih tinggi.
Daftar nomor 4-7 ini disortir dalam urutan menurun dan daftar dengan nilai maksimal dipilih.
Mengapa ini bekerja? Di sini Anda melihat konfigurasi yang mungkin untuk semua jenis. Huruf di sebelah angka, memberi tahu Anda aturan mana nomor ini dihasilkan.
- Straight flush:
[5S, 3F, 1G, 1G, 1G, 1G, 1G]
atau[4S, 3F, 1G, 1G, 1G, 1G, 1G]
- Empat jenis:
[4G, 1G, 0F, 0S]
- Rumah penuh:
[3G, 2G, 1F, 0S]
atau[3G, 2G, 0F, 0S]
- Menyiram:
[3F, 1G, 1G, 1G, 1G, 1G, 0S]
- Lurus:
[5S, 2F, 1G, 1G, 1G, 1G, 1G]
, [5S, 1F, 1G, 1G, 1G, 1G, 1G]
, [5S, 1G, 1G, 1G, 1G, 1G, 0F]
, [4S, 2F, 1G, 1G, 1G, 1G, 1G]
, [4S, 1F, 1G, 1G, 1G, 1G, 1G]
,[4S, 1G, 1G, 1G, 1G, 1G, 0F]
- Tiga dari jenis:
[3G, 1G, 1G, 1F, 0S]
,[3G, 1G, 1G, 0F, 0S]
- Dua pasang:
[2G, 2G, 2F, 1G, 0S]
, [2G, 2G, 1F, 1G, 0S]
,[2G, 2G, 1G, 0F, 0S]
- Satu pasang:
[2G, 2F, 1G, 1G, 1G, 0S]
, [2G, 1G, 1G, 1G, 1F, 0S]
,[2G, 1G, 1G, 1G, 0F, 0S]
- Kartu tinggi:
[2F, 1G, 1G, 1G, 1G, 1G, 0S]
, [1F, 1G, 1G, 1G, 1G, 1G, 0S]
,[1G, 1G, 1G, 1G, 1G, 0S, 0F]
Pyth membandingkan daftar elemen-bijaksana. Jadi sudah jelas bahwa Straight flush akan selalu mengalahkan Four of a kind. Sebagian besar aturan poker khas jelas dengan daftar ini. Beberapa tampak saling bertentangan.
- A Straight akan menang melawan Four of a kind atau Full house: Tidak masalah. Jika Anda memiliki kesempatan untuk mendapatkan Four of a kind / Full house dengan kartu sungai, daripada Anda tidak dapat mencapai lurus pada saat yang sama (karena Anda sudah memiliki 2 atau 3 suite yang berbeda di tangan Anda).
- Straight akan menang melawan flush. Jika Anda dapat mencapai flush dan lurus dengan kartu sungai, maka Anda juga dapat mencapai flush lurus. Dan straight flush memiliki skor yang lebih baik daripada straight dan flush.
- Satu pasang
[2G, 2F, 1G, 1G, 1G, 0S]
akan menang melawan dua pasang tangan. Juga tidak masalah. Jika Anda mendapatkan dua pasangan dengan kartu sungai, daripada Anda memiliki setidaknya satu pasangan sebelum sungai. Tetapi ini berarti, Anda dapat meningkatkan ke tiga jenis, yang lebih baik. Jadi dua pasangan sebenarnya tidak akan pernah menjadi jawabannya.
- Kartu tinggi
[2F, 1G, 1G, 1G, 1G, 1G, 0S]
akan menang melawan sepasang tangan yang berpasangan. Jika ini adalah skor terbaik yang dapat Anda capai, sebelum sungai Anda akan memiliki 3 kartu satu suite dan satu kartu suite yang berbeda. Tetapi kemudian Anda dapat memilih kartu dengan salah satu dari dua suite ini dan dengan nilai yang sudah muncul, dan Anda akan berakhir dengan skor [2F, 2G, ...]
, yang juga lebih baik.
Jadi ini memilih jenis solusi yang tepat. Tapi bagaimana cara mendapatkan satu-pasangan terbaik (dari 4 kemungkinan), bagaimana cara memilih yang terbaik, ...? Karena dua solusi satu pasangan berbeda dapat memiliki skor yang sama.
Itu mudah. Pyth menjamin penyortiran stabil (saat mengambil maksimum). Jadi saya sederhana menghasilkan kartu dalam urutan 2h 2s 2c 2d 3h 3s ... Ad
. Jadi kartu dengan nilai tertinggi secara otomatis akan menjadi maksimum.
Detail implementasi
=Zc
memisahkan string input dan menyimpan daftar kartu Z
.
=T+`M}2Tc4"JQKA"
menghasilkan daftar peringkat ['2', ..., '10', 'J', 'Q', 'K', 'A']
dan menyimpannya dalam T
. -sM*T..."hscd"Z
menghasilkan setiap kombinasi peringkat dengan suite, dan menghapus kartu Z
.
o...
memesan kartu-kartu yang tersisa ini dengan: lM.gPkJ
panjang grup dari peringkat, +-4l{eMJlM
menambahkan 4-panjang (suite), +*-5l@\AN}SPMJ+NZSM.:+\AT5
menambahkan 0/4/5 tergantung pada suite (menghasilkan setiap substring panjang 5 dari "A" + T, periksa apakah tangan salah satu dari mereka (perlu menyortir tangan dan menyortir semua himpunan bagian), kalikan dengan 5 - nomor "A" di kartu), _S
mengurutkan daftar menurun.
e
pilih yang maksimal dan cetak.
JavaScript (ES6),
329324317312309 byteBagaimana itu bekerja
Untuk setiap kartu yang tersisa di geladak, kami menghitung skor tangan
S
. Semakin rendah skor, semakin baik tangan.Variabel yang digunakan untuk menghitung skor
F
: falsy jika tangan adalah flushc
: bitmask Clubsd
: bitmask of Diamondsh
: bitmask of Heartss
: bitmask of Spadesx = c | d
: bitmask Clubs ATAU Intany = h | s
: bitmask of Hearts ATAU Spadesa
: bitmask dari semua pakaian gabunganp = c & d | x & y | h & s
: pair bitmask (1)t = c & d & y | h & s & x
: three of a kind bitmask (1)(1) Saya menulis formula ini beberapa tahun yang lalu dan menggunakannya di beberapa mesin poker. Mereka berhasil. :-)
Formula lainnya
c & d & h & s
: empat bitmask jenisa == 7681
: tes untuk straight khusus "A, 2, 3, 4, 5" (0b1111000000001)((j = a / 31) & -j) == j
: tes untuk semua lurus lainnyaGrafik skor
NB: Kami tidak perlu peduli dengan Dua-Pasangan yang tidak mungkin menjadi pilihan terbaik kami. (Jika kita sudah memiliki satu pasang, kita dapat mengubahnya menjadi Tiga Jenis. Dan jika kita sudah memiliki dua pasang, kita dapat mengubahnya menjadi Rumah Penuh.)
Uji kasus
Tampilkan cuplikan kode
sumber
JavaScript (ES6), 307
349Ini cukup besar dan saya tidak yakin itu pendekatan terbaik.
Mungkin masih sedikit golf.Kurang golf
Uji
sumber