Saya suka tantangan permainan kartu jadi saya membuat yang ini untuk permainan kartu Italia Scopa. Keluarga saya telah memainkan game ini sejak dahulu kala. Ini memiliki sistem penilaian yang sangat menarik yang seharusnya menyenangkan untuk bermain golf. Saya akan memposting jawaban dalam R untuk memulai yang menyenangkan, bahwa saya yakin orang akan meningkat
Tantangannya: mencari tahu jumlah poin yang dicetak dalam putaran Scopa, mengingat kartu yang ditangkap pemain selama putaran sebagai input.
Ada 40 kartu di dek Scopa. Jika Anda menggunakan dek internasional Anda menghapus 8s, 9s, dan 10s, meninggalkan A, 2,3,4,5,6,7, Q, J, K di masing-masing suit. 1 Ada dua pemain atau kemitraan, dan setelah setiap putaran, semua kartu akhirnya ditangkap oleh satu atau dua pemain lainnya. Skor dihitung sebagai berikut (informasi lebih lanjut di sini ):
- Pemain dengan skor kartu terbanyak 1 poin.
- Pemain dengan berlian paling banyak (atau koin jika menggunakan dek Italia) mencetak 1 poin.
- Pemain dengan 7 berlian (atau koin), yang dikenal sebagai sette bello atau tujuh cantik, skor 1 poin.
- Pemain dengan skor primiera tertinggi 1 poin. Skor primiera pemain adalah jumlah dari skor kartu bernilai tertinggi yang ditangkap oleh pemain dalam setiap suit (lihat tabel di bawah). Jika Anda tidak memiliki setidaknya satu kartu di setiap suit, Anda kehilangan secara default bahkan jika skor Anda akan melebihi skor lawan Anda. Dalam kasus yang sangat jarang terjadi bahwa tidak ada pemain yang memiliki setidaknya satu kartu di setiap suit, pemain dengan primiera yang lebih tinggi akan mencetak poin. 2
Tabel skor primiera
| Rank | Value |
| ----- | ----- |
| 7 | 21 |
| 6 | 18 |
| A | 16 |
| 5 | 15 |
| 4 | 14 |
| 3 | 13 |
| 2 | 12 |
| Q,J,K | 10 |
Jadi seorang pemain dapat mencetak paling banyak 4 poin dalam satu putaran. 3 Jika ada dasi, yang memungkinkan untuk kartu, berlian, atau primiera , tidak ada yang mendapat nilai.
Penting untuk disadari bahwa karena setiap kartu harus ditangkap oleh salah satu dari dua pemain, Anda dapat menyimpulkan kartu apa yang harus diambil oleh pemain lain walaupun Anda hanya tahu kartu apa yang diambil oleh satu pemain. Anda harus melakukan ini untuk menilai primiera dengan benar .
Aturan tantangan
Memasukkan
Kode Anda harus diambil sebagai input kartu yang diambil oleh satu pemain selama putaran Scopa.
Input harus dalam format string, di mana satu karakter mewakili peringkat setiap kartu dan satu karakter yang sesuai. Ini menghilangkan celah potensial untuk lulusskor primiera secara langsung sebagai input. Konversi peringkat kartu keskor primiera harus dilakukan dalam program. Namun Anda dapat memilih untuk menggunakan string tunggal yang dipisahkan oleh spasi atau koma, array string, atau format lainnya. Misalnya jika Anda memilih untuk menyandikan peringkat sebagai76A5432QJK
dan cocok karenaDCHS
Anda dapat menggunakan input seperti['7D', '6H', 'QD', 'JS']
atau'7D,6H,QD,JS'
.
Keluaran
Integer dari 0 hingga 4 mewakili skor pemain.
Kemenangan
Jawaban terpendek dalam byte menang!
Uji kasus
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "7C", "6C", "4C", "3C", "2C", "7H", "4H", "2H", "5S", "3S", "QS", "JS", "KS"]
Skor 4 : 1 poin untuk> 20 kartu, 1 poin untuk> 5 berlian, 1 poin untuk 7 berlian, dan 1 poin untuk skor 78 di primiera (7,7,7,5 di mana lawan memiliki 7,6,5, K untuk 64)
["3D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "QC", "4H", "7S"]
Skor 0 : <= 20 kartu, <= 5 berlian, no 7 berlian, dan hanya skor 69 di primiera (7,7,4,3 di mana lawan memiliki 7,7,6, K untuk 70)
[7D", "6D", "AD", "5D", "4D", "3D", "2D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "7H", "6H", "AH", "5H", "4H", "3H", "2H"]
Skor 3 : 1 poin untuk> 20 kartu, 1 poin untuk> 5 berlian, 1 poin untuk 7 berlian. The primiera akan 63 (7,7,7) dan lawan hanya bisa mencetak 51 (7, Q, Q, Q) tapi karena tangan ini tidak memiliki sekop kehilangan titik secara default.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH", "QS"]
Skor 3 : <= 20 kartu, 1 poin untuk> 5 berlian, 1 poin untuk 7 berlian. The primiera hanya skor 51 (7, Q, Q, Q) dan lawan bisa mencetak 63 (7,7,7) tapi karena tangan lawan tidak memiliki berlian tangan ini memenangkan primiera titik secara default.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "7C", "7H"]
Skor 3 : <= 20 kartu, 1 poin untuk> 5 berlian, 1 poin untuk 7 berlian. Meskipun tangan ini tidak memiliki sekop, ia masih memenangkan primiera dengan skor 63 hingga 57 (7,7,7 berbanding 7,6,6) karena tangan lawan tidak memiliki berlian.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH"]
Skor 2 : <= 20 kartu, 1 poin untuk> 5 berlian, 1 poin untuk 7 berlian. Tangan ini tidak memiliki sekop, dan tangan lawan tidak memiliki berlian. Lawan memenangkan primiera dengan skor 63 hingga 41 (7,7,7 lawan 7, Q, Q).
[]
(array kosong)
Skor 0
1: Setidaknya di keluarga kami, Jack mengalahkan Queen di Scopa tetapi ini tidak relevan untuk tujuan mencetak gol.
2: Saya sudah memainkan game ini sejak kecil dan belum pernah melihat itu terjadi tetapi kode Anda lebih baik untuk menangani kasus itu!
3: Ada poin bonus untuk skor "sweep" selama putaran yang saya abaikan untuk tujuan tantangan ini.
sumber
Jawaban:
Ruby,
156153 byteCobalah online!
Ini digunakan
;865432000
untuk mewakili76A5432QJK
masing-masing, dan pakaian dalam huruf kecil. (Pilihan karakter adalah karena mengurangi 38 dari masing-masing memberikan nilai primiera mereka, tetapi kita tidak pernah benar-benar melakukannya karena hanya perbedaan relatif yang penting.)Kami tidak memeriksa apakah salah satu pemain kehilangan jas karena itu tidak perlu - karena semua kartu dihitung sebagai 38 ditambah nilai aktualnya, jika seseorang kehilangan jas, skor tertinggi yang bisa mereka dapatkan adalah (21 + 38) * 3 = 177, yang kurang dari (10 + 38) * 3 + 21 + 38 = 203, skor terendah yang bisa didapat pemain lain. Kami tidak dapat memiliki dua pemain yang kehilangan jumlah suit yang tidak nol, karena seorang pemain hanya bisa kehilangan 0, 1, atau 2 suit, dan jika seseorang kehilangan 2 suit, mereka memiliki semua kartu dari 2 suit yang lain.
sumber
R,
320298265238229224211209179 byteIni adalah solusi sebagian besar karena @digEmAll, dalam bentuk fungsi.
Cobalah online!
Di bawah ini adalah yang terbaik dari upaya saya yang biasa-biasa saja lama untuk 209 byte.
sunting: bermain golf dengan aliasing beberapa fungsi, lalu dengan mengambil ide Doorknob untuk menambahkan konstanta pada skor alih-alih memeriksa setelan.
suntingan berikutnya: menyingkirkan beberapa redundansi dan kemudian memasukkan beberapa perbaikan dari Giuseppe
sunting berikutnya: -2 bytes berkat digEmAll
Saya buruk dalam hal ini, jadi saya yakin seseorang dapat memperbaiki ini jika mereka mau meluangkan waktu. Saya merasa seperti itu
sapply
danfunction
sangat panjang dan bisa menyingkirkan mereka tetapi saya tidak tahu caranya. Input adalah string dua karakter dalam notasi standar.sumber
JavaScript (ES6),
171163 byteMengambil input sebagai satu set kartu, menggunakan representasi standar mereka.
Cobalah online!
Berkomentar
sumber
05AB1E , 41 byte
Cobalah online atau periksa semua test case .
Setelan
DCHS
masing-masing diwakili oleh0123
. Peringkat7A65432KJQ
masing-masing diwakili oleh0123456789
. Itu diambil sebagai string, bukan bilangan bulat, seperti yang dipersyaratkan oleh tantangan (tapi kemudian 05AB1E mengubahnya menjadi bilangan bulat bila diperlukan pula).Seperti dalam solusi lain, kami menambahkan konstanta besar (14) untuk setiap skor primiera untuk membuat pemeriksaan untuk jas yang hilang tidak perlu.
sumber
MS SQL Server 2017 , 525 byte
Cobalah di db <> biola .
sumber
Retina 0.8.2 , 334 byte
Cobalah online! Tautan termasuk kasus uji. Penjelasan:
Buat daftar semua 40 kartu.
Keluarkan kartu yang dipegang pemain.
Ganti setiap peringkat dengan urutannya, yaitu 9 untuk
7
dan 10 kurang dari nilainya untuk kartu lainnya.Urutkan kartu berdasarkan jenis dan urutan.
Hitung jumlah kartu dalam setiap suit dan juga tangkap kartu dengan peringkat tertinggi di setiap suit, dapatkan berlian tertinggi dua kali.
Periksa apakah berlian tertinggi adalah 7.
Hapus semua kartu tertinggi jika salah satu kartu tidak memiliki kartu.
Konversikan kartu tertinggi menjadi skor unary dan jumlahkan semuanya. Konversi juga jumlah kartu dan panjang kartu menjadi unary.
Skor poin jika total, berlian, atau primiera, lebih tinggi.
Total skor.
sumber
C # (Visual C # Interactive Compiler) , 193 byte
Cobalah online!
sumber
AWK , 235 byte
Cobalah online!
Setelan peta ke 1234 (4 adalah berlian), nilai peta ke 0123456789. Program ini mengubah kasus uji menjadi format yang diterima:
Tujuan saya hanya untuk mengalahkan implementasi Python terkemuka: D
sumber
Python 3 ,
249 245 239238 byte-4 byte terima kasih kepada @ovs
-6 byte berkat @movatica
Cobalah online!
sumber
int('0734569c00'[int(x[0])],13)
danif x[1]<'E'
dapat ditulis sebagaiif'E'>x[1]
all(s in''.join(C)for s in S)
dapat disingkat menjadinot S.strip(''.join(C))
, menghemat 6 byte