pengantar
Dahulu kala, ketika saya biasa memberi kode permainan kartu dengan kartu permainan yang biasa, saya biasa menentukan nomor untuk setiap kartu dan memanggil fungsi dengan beberapa nomor untuk mendapatkan kartu. Ini agak menginspirasi saya untuk membuat tantangan ini.
Jadi bagi orang-orang yang tidak mengetahui kartu bermain, setumpuk kartu terdiri dari 52 kartu (13 di masing-masing empat suit, yaitu, Hearts, Diamonds, Spades, Clubs). Di setiap suit, ada 13 kartu - pertama kartu bernomor 2-10, kemudian Jack (J), Queen (Q), King (K) dan Ace (A). Ini perintahnya
Tantangan
Tantangannya adalah mengambil integer antara 1-52 sebagai input dan menampilkan kartu pada posisi itu. Tapi, hasil Anda harus dalam kata-kata. Juga, pesanan harus dipertahankan, yaitu, 13 kartu pertama akan dari Hearts, kemudian Diamonds, kemudian Spades dan akhirnya Clubs.
Misalnya, jika seseorang memilih nomor tersebut 30
. Kartu tersebut kemudian akan menjadi milik jas ketiga, yaitu Sekop. Juga, itu akan menjadi kartu keempat dalam gugatan itu, yang berarti angka 5. Oleh karena itu output Anda dalam kata-kata harus: five of spades
dan itu harus selalu mengikuti format ini , yaitu, pertama kartu, diikuti oleh of
dan nama gugatan pada akhirnya, dengan ruang yang dibutuhkan di antaranya.
Masukan dan keluaran
Input akan berupa bilangan bulat antara 1-52 (termasuk keduanya). Perhatikan bahwa penghitungan di sini dimulai dari 1. Anda dapat memilih mulai dari 0 . Namun, Anda harus menjaga urutan kartu yang disebutkan di atas. Keluaran Anda harus berupa kartu pada posisi itu yang ditulis dengan kata-kata. Anda tidak perlu menangani input yang tidak valid. Juga, output Anda mungkin dalam huruf kecil atau huruf besar.
Diberikan di bawah ini adalah daftar semua input yang mungkin dan outputnya:
1 -> two of hearts
2 -> three of hearts
3 -> four of hearts
4 -> five of hearts
5 -> six of hearts
6 -> seven of hearts
7 -> eight of hearts
8 -> nine of hearts
9 -> ten of hearts
10 -> jack of hearts
11 -> queen of hearts
12 -> king of hearts
13 -> ace of hearts
14 -> two of diamonds
15 -> three of diamonds
16 -> four of diamonds
17 -> five of diamonds
18 -> six of diamonds
19 -> seven of diamonds
20 -> eight of diamonds
21 -> nine of diamonds
22 -> ten of diamonds
23 -> jack of diamonds
24 -> queen of diamonds
25 -> king of diamonds
26 -> ace of diamonds
27 -> two of spades
28 -> three of spades
29 -> four of spades
30 -> five of spades
31 -> six of spades
32 -> seven of spades
33 -> eight of spades
34 -> nine of spades
35 -> ten of spades
36 -> jack of spades
37 -> queen of spades
38 -> king of spades
39 -> ace of spades
40 -> two of clubs
41 -> three of clubs
42 -> four of clubs
43 -> five of clubs
44 -> six of clubs
45 -> seven of clubs
46 -> eight of clubs
47 -> nine of clubs
48 -> ten of clubs
49 -> jack of clubs
50 -> queen of clubs
51 -> king of clubs
52 -> ace of clubs
Mencetak gol
Ini kode-golf , jadi kode terpendek menang.
sumber
two\s\s\sof\shearts
tempat\s
singkatan dari spasi? (Perhatikan dua ruang ekstra.)Jawaban:
Python 3 ,
11590 byteFungsi yang tidak disebutkan namanya mengembalikan string dalam huruf besar.
Cobalah online!
Bagaimana?
Karakter Unicode memiliki nama. Nama-nama beberapa di antaranya seperti "KARTU PEMAIN DUA KEDUA", maka kita bisa mendapatkan karakter karakter Unicode yang mewakili kartu yang diperlukan dan menanggalkan 13 karakter pertama untuk mendapatkan output kami.
Karakter Unicode yang menarik ada di dalam blok seperti ini:
Di mana
x
bukan karakter yang kita cari (empat diC
kolom adalah "ksatria"; tiga diF
adalah "pelawak"; satu di0
adalah generik; sisanya adalah karakter cadangan).Dengan demikian kita dapat menambahkan beberapa nilai ke 0x1F0A1 = 127137 (As) untuk menemukan kartu yang kita inginkan.
Nilai untuk ditambahkan hanya rumit oleh tiga hal:
Menggunakan opsi satu-pengindeksan memungkinkan penggunaan divisi integer negatif untuk mengindeks ke dalam array of-line offset untuk setelan ulang pemesanan dengan
[6,0,4,2][-n//13]*8+
(secara efektif[48,0,32,16][-n//13]
), kita kemudian dapat juga menempatkan kartu As ke lokasi yang benar dengann%13+
dan kemudian menghindari ksatria di kolomC
dengann%13//11+
(efektif(n%13>10)+
).sumber
Perl6 / Rakudo 70 byte
Indeks 0
Menggunakan
perl6 -pe
, dan tanpa kompresi kamus:Itu hanya mencari kartu di Unicode (mulai dari Ace), menanyakan nama dan menggunakannya. Ini adalah rute yang mirip (meskipun saya tidak tahu saat itu!) Untuk jawaban Python Jonathan Aitken - hanya saya indeks dari semua 4 ace daripada 4 offset dari Ace of Spades, dan saya kalikan dengan 1,091 untuk membuat indeks putaran dari entri Knight di Unicode.
Lihat semua output (untuk nilai input 0 hingga 51) https://glot.io/snippets/ez5v2gkx83
Diedit untuk mengatasi Knights di dek Unicode, karena Unicode.
Perl6 ♥ Unicode
sumber
05AB1E , 54 byte
Diindeks 0
Cobalah online!
Penjelasan
sumber
“»€Å‹ spadesž…“#"of "ì“‚•„í†ìˆÈŒšï¿Ÿ¯¥Š—¿—ÉŸÄ‹ŒÁà“#âí»
- 54 Bytes juga!Python 2 ,
167148 byteDiindeks nol.
Cobalah secara Online!
EDIT: Bubbler membuat poin bagus menggunakan metode split (dan memberikan jawaban yang lebih pendek). Pada blok kedua menggunakan split () menghasilkan jumlah byte yang sama.
sumber
[n%13::13]
atau sesuatu, tetapi tidak berhasil.s
; xnor menunjukkannya dalam obrolan.R , 154 byte
Cobalah online!
Mengambil input (1-diindeks) dari STDIN dan dengan
source(...,echo=T)
akan mencetak hasilnya ke konsol.Itu tidak cantik, TETAPI datang dalam 2 byte lebih pendek dari solusi terbaik yang saya bisa gunakan
outer
(disajikan di bawah), jadi biarkan ini menjadi pengingat untuk memeriksa pendekatan lain!R , 156 byte
Cobalah online!
Intinya sama dengan di atas; Namun,
outer
akan melakukan daur ulang dengan benar, tetapi harus mengatursep=" of "
agarpaste
rambut ini hanya dibuat lebih panjang.sumber
Emojicode , 202 byte
0 diindeks. Cobalah online!
Penjelasan :
sumber
Excel, 156 byte
Kartu dari 0-51. Sayangnya, Excel tidak memiliki fungsi untuk dikonversi
1
ke"one"
...Menggunakan
TRIM
danMID
lebih pendek daripada menggunakanCHOOSE
untuk nilai nominal, tetapi lebih lama dari menggunakanCHOOSE
untuk Suit.sumber
MID()
dan menggabungkan kata-kata!Java 8, 141 byte
Input diindeks 0.
Penjelasan:
Cobalah online.
sumber
Kotlin ,
154152140 byteCobalah online!
Diperbarui untuk menggunakan hanya ekspresi lambda.
sumber
JavaScript ES6,
124118 Bytes, 0-indeksVersi Base64
sumber
Stax ,
585756 byteJalankan dan debug itu
Berikut adalah representasi tanpa komentar yang dikomentari dari program yang sama. Ini menggunakan liter terkompresi stax banyak. Masukan diindeks 0. Ini adalah algoritma 05AB1E Emigna.
Jalankan yang ini
sumber
Bash, 133 byte
Memilih untuk menggunakan 0 berdasarkan pilihan yang diberikan, mendukung 0 (dua hati) hingga 51 (ace klub)
sumber
Sekam , 52 byte
Cobalah online!
Saya selalu senang memamerkan sistem kompresi string Husk: D
Penjelasan
Mayoritas program (dari
¨
seterusnya) jelas merupakan string terkompresi. Ketika tidak terkompresi, ia berubah menjadi:Programnya adalah:
Ada beberapa hal yang perlu dijelaskan:
Kami membuat kartu dengan setelan sebelum nilai karena cara
Π
kerja produk kartesius : jika kami melakukannya sebaliknya, daftar kartu akan dipesan berdasarkan nilainya (yaitu dua hati, dua berlian, dua sekop, dua dari klub, tiga hati ...). Sebagai konsekuensinya, kita harus membalikkan hasil kita.Hasil dari program ini adalah matriks string dua dimensi. Ini secara otomatis dicetak oleh Husk sebagai string tunggal yang dibangun dengan menggabungkan baris-baris matriks dengan baris baru dan sel dengan spasi. Alasan kami membangun matriks ini alih-alih menggunakan yang lebih mudah
w
(bergabung dengan daftar kata dengan spasi) adalah bahwa jika menggunakanw
tipe inferencer menebak interpretasi lain untuk program, menghasilkan hasil yang berbeda.sumber
mIRCScript , 157 byte
Beban sebagai alias, kemudian gunakan:
/c N
. mIRC adalah 1-diindeks, sehingga pembagian lantai (//) pada nilai negatif dari input menghasilkan -1 hingga -4 seperti yang diperlukan.sumber
C (gcc) , 148 byte
Cobalah online!
Berbasis 0.
sumber
\0
dengan byte nol literal.Haskell , 132 byte
Cobalah online!
Fungsi anonim, menggunakan pemahaman daftar untuk membangun semua kombinasi yang sesuai dan nilai, dan mengindeks ke dalam daftar yang dihasilkan dengan input.
sumber
F #,
174168 byteMenghapus beberapa spasi putih tambahan seperti dicatat oleh Manish Kundu. Terima kasih!
Cobalah online!
Saya akan jujur - Saya baru di kode golf, jadi saya tidak tahu apakah lebih tepat untuk menjawab dengan fungsi murni seperti ini (dengan parameter, tetapi tidak ada I / O) atau dengan blok kode yang berfungsi dengan pengguna I / O.
sumber
Oktaf ,
155153151150 byteCobalah online!
Ini menciptakan string yang dimulai dengan
' of '
dan's'
, kemudian semua setelan diikuti oleh semua peringkat. String ini dipisah pada koma menjadi string terpisah. Gugatan berada di depan pangkat, karena sejak itu menyimpan satu byte saat membuat indeks. Setelah ini, kami indeks menggunakan kurung siku dengan indeks berikut:yang merupakan peringkat, diikuti oleh elemen pertama
' of '
, diikuti oleh gugatan itu, diikuti oleh's'
.Memiliki
's'
sebagai bagian dari jas (hearts,diamonds,spades,clubs
) alih-alih string terpisah adalah panjang yang sama persis tetapi kurang menyenangkan.Membagi pada pemisah default
akan menghemat 4 byte di
strsplit
-call, tetapi ruang di sekitar' of '
akan dihapus dan harus ditambahkan secara manual, dengan biaya lebih banyak byte.sumber
V ,
154147144142 Bytes-7 Bytes berkat DJMcMayhem
Cobalah online!
Hexdump:
sumber
« == \+
2)12dj == 13D
ò
? Saya mencobaò13j0Pò
bukan4ñ13j0Pñ
, tapi itu tidak berhentiP
menambah baris baru? Juga, apakah Anda yakin Anda membutuhkan0
bagian itu? Sepertinya saya seperti itu mungkin akan bekerja tanpa0
itu tidak perluC # ,
219207202197 byte (0 diindeks)terima kasih untuk masukan dari @Ciaran_McCarthy dan @raznagul
Mengambil input dari int I, kurangi 1 untuk mencocokkan 0 pengindeksan dari array string dan mengeluarkan angka berdasarkan pada I mod 13 dan setelan berdasarkan pada i / 14 + 13.
berfungsi cukup baik untuk kode golf kedua saya, hanya ingin tahu apakah saya bisa membuatnya lebih pendek menggunakan LINQ atau yang lainnya.
sumber
i++
dapat dihapus sepenuhnya. Dengan mengubah fungsi menjadi lambda saya mendapatkannya ke 178 byte .using
-Statement. Pokoknya +1 dari saya."of"
dalam array.PowerShell ,
207192182174165163161157 byteDiindeks 0
Cobalah online!
4 byte disimpan berkat AdmBorkBork di komentar
sumber
-split
pada spasi putih untuk menghemat 6 byte-split'two three four five six seven eight nine ten jack queen king ace'
dan byte lain menggunakan inline replace, bukan floor$_/13-replace'\..*'
CJam , 114 byte
Cobalah online!
Diindeks nol. Mungkin akan dikalahkan oleh bahasa dengan kompresi kamus, tapi oh well ...
sumber
Jelly , 61 byte
Pengindeksan 0. Cobalah online!
sumber
“...“...»Ḳ€¤Œpị@j“ of
mungkin lebih pendek.Julia 0,6 , 156 byte
Cobalah online!
-2 byte terima kasih kepada @Stewie Griffin
sumber
Haskell , 144 byte
Cobalah online!
Ini menyentuh semua jenis poin rasa sakit Haskell.
sumber
SOGL V0.12 , 53 byte
Coba Di Sini!
sumber
Javascript
149143140 byte-3 bit terima kasih kepada @rick hitchcock
sumber
[_/13|0]
. Misalnya:["hearts","diamonds","spades","clubs"][_/13|0]
a=
karena fungsi Anda tidak rekursif.Perl 5
-p
, 119 byteBerbasis 0
Cobalah online!
sumber
Japt ,
9186 byteDiindeks 0.
Saya menggunakan alat yang ditulis oleh @Shaggy untuk menghasilkan daftar terkompresi.
Cobalah online!
Penjelasan:
String terkompresi pertama berisi nilai kartu yang dibatasi oleh
d
. String terkompresi kedua berisi peringkat kartu yang dibatasi olehk
.Karakter ini dipilih menggunakan alat Shaggy, yang menghasilkan string yang dibatasi oleh char yang dikompres secara optimal menggunakan shoco (kompresi yang digunakan Japt). Ini memungkinkan kami untuk membuat daftar nilai dan peringkat kartu.
Kami menggunakan backticks
`
untuk mendekompresi string ini, kemudian kami membagi string menggunakanq
, diikuti oleh char untuk membagi.Setelah kami memiliki daftar, kami memetakan melalui nilai kartu, lalu kami mendapatkan indeks dari input. Penting untuk dicatat bahwa Japt membungkus indeksnya, jadi kita tidak perlu modulo sampai 13.
Di setiap item, kami mengulangi peringkat kartu. Kami mendapatkan indeks dengan membagi input dengan 13.
Setelah kami memiliki kedua item, kami menggabungkannya dengan
" of "
, yang menghasilkan string terakhir.sumber
Jelly ,
5855 byteCobalah online!
sumber