Catatan: Ini terkait dengan variasi permainan Rummikub
Latar Belakang & Aturan
Rummikub adalah game berbasis ubin. Ada empat warna: merah, oranye, biru dan hitam. Untuk setiap warna ada 13 ubin (diberi label dari 1 hingga 13), dan ada juga 2 Pelawak yang tidak tergantung warna, maka totalnya ada 54 buah. Dalam variasi Rummikub ini, setiap pemain menerima 14 ubin dan harus mendapatkan satu ubin lagi dan menjatuhkan satu lagi setiap putaran, sehingga jumlah ubin konstan. Para pemain tidak melihat ubin masing-masing. Tujuannya adalah untuk mengelompokkan ubin, sehingga semua bagian memiliki setidaknya satu grup (lihat di bawah). Ketika seorang pemain memiliki semua potongan yang dikelompokkan, mereka menjatuhkan papan ubin mereka dan mengungkapkan potongan mereka. Yang lain kemudian memeriksa apakah semua kombinasi itu valid, dan jika benar, pemain memenangkan ronde.
Bagaimana ubin bisa dikelompokkan?
Hanya ada dua jenis grup:
Grup multi-warna :
- Mereka terdiri dari 3 atau 4 ubin.
- Mereka hanya berisi ubin dengan nomor yang sama.
- Semua ubin memiliki warna yang berbeda.
- Contoh:
RED 9, BLUE 9, BLACK 9
.
Grup satu warna :
- Mereka terdiri dari setidaknya 3 ubin.
- Mereka tidak dapat berisi lebih dari 13 ubin.
- Mereka hanya berisi ubin dengan nomor yang berbeda dan berurutan, dalam urutan menaik.
- Semua ubin memiliki warna yang sama.
- Ubin berlabel
1
mungkin bukan tempat setelah ubin berlabel13
. - Contoh:
RED 5, RED 6, RED 7
.
Tunggu, apa yang dilakukan Jokers?
Pelawak dapat mengganti bagian apa pun dalam permainan. Misalnya, contoh pertama kita bisa menjadi JOKER, BLUE 9, BLACK 9
, RED 9, JOKER, BLACK 9
atau RED 9, BLUE 9, JOKER
. Hal yang sama berlaku untuk contoh kami yang lain. Namun, seseorang tidak boleh menempatkan dua Pelawak dalam kelompok yang sama, sehingga hal-hal seperti JOKER, ORANGE 8, JOKER
itu dilarang.
Tugas
Diberikan grup ubin Rummikub, tentukan apakah itu valid. Anda dijamin bahwa tidak ada ubin duplikat akan muncul, kecuali untuk 2 pelawak dan bahwa ubin yang Anda terima sebagai input valid (mis. Hal-hal seperti 60
tidak akan muncul).
Input output
Anda dapat mengambil input dan memberikan output dengan metode standar apa pun.
Beberapa format input yang valid: daftar string, daftar tupel, daftar bersarang, string, atau apa pun yang Anda temukan cocok. Warna dapat diambil sebagai Strings (misalnya:) "Blue","Red", etc.
, sebagai singkatan String (harap buat ubin Biru dan Hitam dapat dibedakan), atau sebagai bilangan bulat sesuai dengan warna. Ketika datang ke Jokers, Anda harus menyebutkan cara program Anda menerimanya sebagai input. Jika Anda memilih Strings, Anda mungkin memiliki sesuatu seperti RED 9, JOKER, ...
, jika Anda memilih tuple yang dapat Anda miliki (9,"RED"), ("JOKER")
atau sesuatu yang setara. Jika itu membantu, Anda mungkin menerima warna untuk Joker itu (yang seharusnya tidak mempengaruhi output program Anda). Sebagai contoh, Anda mungkin memiliki ("JOKER","RED")
atau ("JOKER","BLUE")
, tetapi itu seharusnya tidak mempengaruhi output dengan cara apa pun.
Mengenai output, aturan standar untuk masalah keputusan berlaku.
Contoh yang berhasil
Mari kita ambil contoh, yang diharapkan akan membuatnya lebih mudah untuk dipahami. Diberikan grup sebagai berikut, di mana setiap tupel mewakili ubin:
[(9, "RED"), (9, "ORANGE"), ("JOKER"), (9, "BLACK")]
Ini harus mengembalikan nilai kebenaran, karena inputnya valid. Dalam hal ini, pengganti Joker (9, "BLUE")
, dan mereka membentuk kelompok multi-warna.
Jika Anda akan diberikan grup berikut:
[(9, "BLUE"), (9, "ORANGE"), (9, "RED"), (9, "BLACK"), ("JOKER")]
Itu akan tidak valid, dan dengan demikian program Anda harus mengembalikan nilai falsy, karena tidak ada yang tersisa untuk diganti oleh joker, karena jumlah maksimum kartu dalam kelompok multi-warna adalah 4.
Kasus Uji Tambahan
Ini adalah untuk rangkaian uji diperpanjang yang mencakup hampir semua situasi yang mungkin:
Input -> Output [(1, "BIRU"), (2, "BIRU"), (3, "BIRU"), (4, "BIRU"), (5, "BIRU"), (6, "BIRU")] - > jujur [(6, "BLUE"), (6, "RED"), (6, "BLACK)] -> truthy [(5, "BLACK"), (6, "BLACK"), (7, "BLACK"), (8, "BLACK"), (9, "BLACK"), (10, "BLACK"), ( "JOKER"), (12, "BLACK")] -> benar [("JOKER"), (3, "BLUE"), (3, "RED")] -> truthy [(8, "BLACK"), (2, "RED"), (13, "BLUE")] -> falsy [(4, "RED"), (3, "RED"), (5, "RED")] -> falsy [(5, "BLACK"), (6, "BLACK)] -> falsy [("JOKER"), (5, "RED"), ("JOKER")] -> falsy [(4, "RED"), (5, "RED"), (6, BLUE ")] -> falsy [(4, "RED"), ("JOKER"), (5, "RED")] -> falsy [(12, "BLACK"), (13, "BLACK), (1," BLACK ")] -> falsy
Ini adalah kode-golf , jadi kode terpendek dalam byte di setiap bahasa menang!
sumber
Jawaban:
APL (Dyalog) , 58 byte
Mengambil daftar warna (1-4) sebagai argumen kanan dan daftar angka sebagai argumen kiri. Nomor Joker dilambangkan
(⍳4)
yang setara dengan(1 2 3 4)
untuk menunjukkan bahwa itu bisa salah satu dari mereka. Demikian juga, warnanya dilambangkan(⍳13)
untuk menunjukkan bahwa itu bisa berupa angka dari 1 hingga 13.Cobalah online!
Algoritma
Ada tiga kondisi, dimana dua yang terakhir memiliki dua kondisi masing-masing:
DAN LAINNYA
satu nomor DAN
warna yang unik
ATAU
agar proses berjalan valid.
Urutan membaca
3≤
3 kurang dari atau sama dengan≢⍺
jumlah ubin∧
dans⍵
semua angka sama∧
dan⍺≡∪⍺
warnanya unik∨
atau1∊
1 adalah di antara≢∘∪¨
jumlah warna unik yang⊃,¨/
diperluas⍺
∧
dan∨/
terdapat setidaknya satu di∊
antara semua⊃,¨/⍵
bilangan yang diperluas⍷¨⊂
yang ditemukan dalam⍳13
1 hingga 13Penjelasan kode lengkap
{
...}
fungsi anonim di mana⍺
argumen kiri dan⍵
argumen benar3.2.
⍳13
angka 1 hingga 13(
…)⍷¨
Temukan posisi awal dari masing-masing proses berikut:,¨/⍵
bergabung dengan masing-masing elemen angka (membuat lari untuk setiap nilai Joker)⊃
mengungkapkan (karena/
mengurangi peringkat)∊
ϵ daftar (ratakan)∨/
ATAU pengurangan (yaitu, apakah benar?)(
...)∧
DAN:3.1
(
...)⍺
hasil penerapan fungsi berikut pada daftar warna:s←{
...}
s (untuk s ame) yang merupakan fungsi anonim berikut (⍵
adalah yang argumen):,¨/⍵
bergabung dengan setiap elemen di seberang (menciptakan lari untuk setiap nilai Joker)⊃
mengungkapkan (karena/
mengurangi peringkat)≢∘∪¨
jumlah elemen unik di setiap daftar1∊
Apakah salah satu anggota? (yaitu apakah ada daftar semua yang sama?)(
...)∨
ATAU:2.2.
∪⍺
warna yang unik⍺≡
identik dengan warna (yaitu mereka unik)(
...)∧
DAN:2.1.
s⍵
jumlahnya semua sama(
...)∧
DAN1.
≢⍺
jumlah warna (yaitu jumlah ubin)3≤
tiga kurang dari atau sama dengan itusumber
Jelly ,
41403836 byteCobalah online! (dilengkapi dengan footer test-suite)
Mengambil input sebagai array
(color, value)
untuk ubin biasa dan0
untuk pelawak. Warna direpresentasikan sebagai bilangan bulat (walaupun saya tidak yakin apakah itu penting untuk kode saat ini).Output
1
(benar) atau0
(falsy).Penjelasan
sumber
Python 2 ,
371 370 362 341 329325 bytestr.split()
bukanlist literal
len(x)-1
J O BK B R
untukJoker, Orange, Black, Blue, Red
literalCobalah online!
sumber
BK
denganb
untuk menyimpan 1 byte (TIO dengan kasus uji diperbarui keb
.Javascript (ES6), 286 byte
(Perhatikan bahwa kasus uji di atas mengandung 2 kasus uji tambahan yang tidak ada dalam Pertanyaan: masing-masing benar dan salah: lihat versi yang tidak diklik untuk dibaca).
Proses kasar:
Pelawak diindikasikan dengan memiliki
0
sebagai nilai numeriknya (angka negatif juga berfungsi); ini menjaga agar input tetap konsisten (memiliki Warna dan Nilai) dan tidak bergantung pada keharusan memeriksa apakahc=="JOKER"
, menghemat 7 byte.Mungkin beberapa tanda kurung dapat dihapus, mungkin dimungkinkan untuk tidak membuat kotak
q
sebagai array (saya mencobanya dan nilainya tinggal 0 atau menyebabkan setan hidung ).Tidak Disatukan:
Versi yang saya kerjakan untuk mendapatkan logika yang benar. Lambda sekali pakai disatukan; inilah fungsi yang sesuai:
sumber
C # (.NET Core) , 198 byte
Mengambil warna ubin dan angka sebagai daftar bilangan bulat yang terpisah. Spesifikasi pemetaan itu tidak masalah asalkan masing-masing warna memiliki bilangan bulat yang berbeda dan Jokers direpresentasikan sebagai 0.
Format untuk memasukkan angka cukup istimewa. Angka yang perlu diinput untuk angka
n
adalah 2 ^ n, sedangkan angka yang digunakan untuk mewakili joker adalah (2 ^ 14) -1. Ini memungkinkan bitwise danu&x
untuk mengevaluasi Anda jika ubin x memiliki nilai yang sama dengan Anda atau adalah joker.C # (.NET Core) , 200 byte
Solusi 2 byte lebih lama yang tidak eklektik tentang input. Ternyata hanya menggunakan kasing khusus untuk para pelawak di satu tempat yang sulit mereka tangani, tidak lebih lama dari operasi bitwise pintar yang sangat kubanggakan. Di sini Joker adalah (0,0), angka lain seperti yang diharapkan, dan warna diwakili 4 nilai yang berbeda satu sama lain dengan perbandingan default C # (khususnya,
Distinct()
operasi Linq harus mempertimbangkan nilai untuk warna yang sama sebagai 'tidak berbeda' dan nilai untuk warna berbeda sebagai 'berbeda').Sesuatu yang mungkin berguna untuk bahasa lain,
u*=!u++^x*x
akan setara denganu=u==x|x<1?u+1:0
di beberapa bahasa; u ^ x adalah 0 iff u == x, dan 0 kali int adalah 0, jadi u ^ x * x akan menjadi 0 untuk u == x atau x == 0 jika C # tidak membuat operasi bitwise lebih diutamakan daripada yang matematika. C # juga tidak dapat menafsirkan int sebagai bools tanpa casting eksplisit. Sebuah bahasa yang berusaha lebih keras untuk membuat tipe berfungsi mungkin mengonversi nilai0
dannot 0
kefalse
dantrue
sebelum menerapkannya!
, dan kemudian ketika kembali ke int menafsirkan!false
sebagai 1 dan!true
0. Semua yang mengatakan, saya tidak dapat menjamin bahasa lain akan benar-benar manfaat dari sisa algoritma sehingga bahkan mungkin tidak muncul.sumber
Scala,
491477 karakter,491477 byteTantangan ini menyenangkan; Terima kasih.
Jadi
f
pada saluran 4 adalah panggilan rekursif di mana saya mencoba mengganti "JOKER" oleh setiap ubin lainnya. Lihat tio untuk tampilan kode yang lebih jelas. Saya memilih menerima sebagai masukan urutan 2-tupel (Int, String) - dipanggilt
dalam kode saya, lihat tio - jadi "JOKER" diwakili oleh 2-tupel (0, "JOKER").EDIT: 14 byte disimpan berkat komentar, saya ambil OB b R untuk ORANGE BLACK BLUE RED.
Cobalah secara Online!
EDIT: -2 byte, dihapus tidak berguna di
(
sekitar kondisicase _ if
ssumber
O,B,b,R
daripadaORANGE,BLUE,BLACK,RED
menyimpan byte? Saya tidak tahu bagaimana Scala bekerja, tetapi saya pikir Anda bisa.var (O,B,b,R)=("ORANGE","BLACK","BLUE","RED")
dan panggilan adalahO
B
b
R
, untuk total 49 byte; di manavar c=Seq("ORANGE","BLACK","BLUE","RED")
dan panggilanc(...)
berjumlah 58 byte. TAPI kasus pertama memungkinkanfor(u<-c)
di tempatfor(u<-Seq(O,B,b,R))
, sehingga biaya tidak -9 tapi 2. Terima kasih sudah mencoba.var c=Seq("O","B","b","R")
dan menggunakan karakter-karakter itu sebagai input Anda alih-alih string penuh untuk warna. Seperti yang disebutkan dalam posting asli, "Warna dapat diambil sebagai ... Singkatan string".