Sebuah kuantitas variabel-panjang (juga disebut sebagai VLQ atau uintvar
) adalah cara untuk mengkodekan hingga nilai integer 28 bit menggunakan hanya sebagai banyak byte yang diperlukan. Ini digunakan dalam format file MIDI sebagai cara untuk meminimalkan ukuran data peristiwa tertentu.
Cara kerjanya cukup sederhana. Sebagai rangkaian byte big-endian, bit paling signifikan (MSB) dari setiap byte adalah 1
untuk menunjukkan bahwa byte VLQ lain mengikuti. 7 bit tersisa dari setiap byte membentuk nilai yang diterjemahkan.
Contoh (dari Wikipedia):
[ 0x86, 0xc3, 0x17 ] => 106903
Referensi tambahan: Wikipedia , Some Guy .
Tantangan:
Diberikan kuantitas panjang variabel, konversikan ke nilai integernya.
Memasukkan:
Daftar satu hingga empat byte atau tipe nilai 32-bit yang mewakili VLQ valid integer.
Keluaran:
Nilai integer dari input VLQ.
Aturan dan penilaian:
- Ini adalah kode-golf, jadi jawaban terpendek dalam byte untuk setiap bahasa menang.
- Aturan standar dan aturan I / O standar berlaku.
- Lubang terlarang (tentu saja).
- Berikan tautan dengan tes untuk kode Anda ( TIO.run , dll).
- Penjelasan yang jelas untuk jawaban Anda sangat dianjurkan.
- Built-in yang menangani konversi ini tidak dilarang, namun tidak menggunakannya jauh lebih menarik.
Kasus uji:
Input (VLQ) Output (int)
[ 0x00 ] => 0
[ 0x07 ] => 7
[ 0x7f ] => 127
[ 0x81, 0x00 ] => 128
[ 0xC0, 0x00 ] => 8192
[ 0xff, 0x7f ] => 16383
[ 0x81, 0x80, 0x00 ] => 16384
[ 0x86, 0xc3, 0x17 ] => 106903
[ 0xbd, 0x84, 0x40 ] => 1000000
[ 0xff, 0xff, 0x7f ] => 2097151
[ 0xC0, 0x80, 0x80, 0x00 ] => 134217728
[ 0xFF, 0xFF, 0xFF, 0x7F ] => 268435455
Catatan: Anda tidak diharuskan menggunakan hex literals untuk merepresentasikan byte sebagai input atau output Anda. Anda dapat menggunakan desimal literal ( [ 129, 128, 0 ]
), integer ( 0x80818000
) atau representasi byte / oktet lainnya yang masuk akal jika lebih cocok untuk platform Anda. Format fleksibel sepanjang mewakili 1-4 byte / oktet.
Golf pergi!
sumber
[0x01, 0x80, 0x02] => 1
?Jawaban:
APL (dzaima / APL) , 8 byte
Cobalah online!
Bagaimana:
sumber
Pari / GP , 24 byte
Cobalah online!
sumber
Bahasa Wolfram (Mathematica) , 25 byte
Cobalah online!
Bahasa Wolfram (Mathematica) , 25 byte
Cobalah online!
sumber
J , 10 byte
Cobalah online!
Mengambil inspirasi dari jawaban APL J Salle.
128|]
Sisa dari angka input dibagi dengan 128128#.
Diterjemahkan sebagai digit angka 128 basissumber
Jelly , 6 byte
Cobalah online!
Setara dengan jawaban Pari / GP alephalpha .
sumber
05AB1E , 6 byte
Cobalah online!
128
sumber
7o
. Saat ini Anda dapat memampatkan bilangan bulat 3-byte tertentu (kisaran[101,355]
) dalam 2 byte, jadi 128 bisa jadiƵR
.. Saya juga bertanya-tanya hal yang sama tentang builtin 2-byte untuk 16 .. Biasanya Anda hanya akan menggunakan literal , atau kalau tidak kita akan memiliki4o
/4n
/8·
jika angka di belakangnya dalam program. Hanya ketika satu angka sebelum angka 16, yang saya pikir tidak akan terjadi, builtin berguna ..Stax , 8 byte
Jalankan dan debug itu
Algoritma:
sumber
JavaScript (ES6), 29 byte
-2 byte terima kasih kepada @Shaggy
Mengambil input sebagai array byte.
Cobalah online!
sumber
APL + WIN, 22 byte
Anjuran untuk vektor bilangan bulat:
Cobalah online! Atas perkenan Dyalog Classic
Penjelasan:
sumber
Stax , 12 byte
Jalankan dan debug di staxlang.xyz!
Dibongkar (14 byte) dan penjelasan:
Stax memiliki built-in konversi basis, tetapi hanya bekerja pada string. Ini hampir berfungsi pada daftar bilangan bulat, meskipun; masalahnya adalah dalam penanganan Stax
0
.String adalah daftar bilangan bulat. Saat Anda menggunakan daftar semacam itu sebagai string, angka nol apa pun secara otomatis dikonversi ke 32 sebagai singkatan untuk spasi. Karena builtin
|b
untuk konversi basis memperlakukan operandnya sebagai string daripada sebagai daftar mentah bilangan bulat, setiap kasus dengan nol akan gagal.10 byte, gagal pada angka nol
Jalankan dan debug di staxlang.xyz!
sumber
{:B7)m$:b
Paket ke 8, dan tampaknya bekerja juga, meskipun itu semacam penggunaan yang eksotis$
.C (gcc) , 48 byte
Mengambil integer dalam urutan big-endian sebagai input, yang merupakan urutan yang sama dengan array byte.
Cobalah online!
C (gcc) , 53 byte
Jika array byte diperlukan:
Cobalah online!
sumber
-O0
, yang memungkinkan Anda untuk (biasanya) menyimpan nilai kembali ke parameter pertama. Ini adalah kekhasan ^ Wfature dalam kode golf, tetapi tidak bekerja dengan tingkat optimisasi yang lebih tinggi.&128
dengan>>7
.MathGolf , 14 byte
Input sebagai bilangan bulat.
Cobalah online.
Saya merasa ini bisa lebih pendek .. Agak menyebalkan bahwa MathGolf memiliki 1-byte builtin untuk konstanta
128
, tetapi tidak ada konversi basis (kecuali untuk biner / heksadesimal).Penjelasan:
sumber
Python 3 ,
5849 byte-9 byte terima kasih kepada @Chas dan @ ar4093
Cobalah online!
atau
Cobalah online!
Input melalui daftar bilangan bulat.
bin
Fungsi Python menambahkan "0b" ke awal string, sehingga harus dilepas sebelum dapat digabungkan.Ini juga tidak terus memimpin nol, jadi jika tidak ada (alias byte terakhir) yang harus ditambahkan kembali. Dan jika ada yang memimpin (alias semua kecuali byte terakhir) yang harus dihapus sebagai baik.Terima kasih kepada @Chas untuk mengetahui bahwa dengan selalu mengatur bit pertama, saya hanya dapat menghapus tiga karakter pertama dan selesai.Rupanya (menurut @ ar4093)
format
fungsi memungkinkan tidak hanya tidak memiliki awalan '0b', tetapi juga menghapus bit pertama dan padding ke 7 karakter pada saat bersamaan.sumber
bin(a|128)[3:]
saat Anda tidak memerlukannyazfill
.bin(a)[2:].zfill(8)[1:]
->f"{a%128:07b}"
PHP , 42 byte
Cobalah online! dan verifikasi semua kasus uji .
Input melalui args baris perintah, output ke
STDOUT
.sumber
Japt ,
108 byteMengambil input sebagai array bilangan bulat.
Cobalah atau jalankan semua test case (header di kedua konversi dari format input yang digunakan dalam tantangan)
Disimpan 2 byte dengan mengambil inspirasi dari solusi alephalpha .
sumber
Arang , 11 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Mengambil input sebagai array. Penjelasan:
sumber
Python 2 , 42 byte
Cobalah online!
sumber
Windows Batch, 76 byte
Lewati parameter yang diawali dengan "0x" dan spasi antara (misalnya 0xC0 0x80 0x80 0x00).
sumber
@set y=,ax=
antara menjalankan.