Untuk penggemar nandgame: Silakan coba DPD ke desimal di gerbang logika juga!
Latar Belakang
Desimal padat dikemas (DPD) adalah cara untuk secara efisien menyimpan angka desimal dalam biner. Ini menyimpan tiga angka desimal (000 hingga 999) dalam 10 bit, yang jauh lebih efisien daripada BCD naif (yang menyimpan satu digit dalam 4 bit).
Notasi
- Huruf kecil
a
untuki
bit yang disalin ke representasi desimal. 0
dan1
bit-bit yang tepat dalam pola bit input atau output.x
bit diabaikan dalam konversi.
Tabel konversi
Berikut ini adalah tabel konversi dari 10 bit DPD ke tiga angka desimal. Setiap digit desimal direpresentasikan sebagai biner 4-bit (BCD). Kedua sisi ditulis dari kiri ke kanan dari digit paling signifikan ke yang terkecil.
Bits => Decimal (Digit range)
a b c d e f 0 g h i => 0abc 0def 0ghi (0-7) (0-7) (0-7)
a b c d e f 1 0 0 i => 0abc 0def 100i (0–7) (0–7) (8–9)
a b c g h f 1 0 1 i => 0abc 100f 0ghi (0–7) (8–9) (0–7)
g h c d e f 1 1 0 i => 100c 0def 0ghi (8–9) (0–7) (0–7)
g h c 0 0 f 1 1 1 i => 100c 100f 0ghi (8–9) (8–9) (0–7)
d e c 0 1 f 1 1 1 i => 100c 0def 100i (8–9) (0–7) (8–9)
a b c 1 0 f 1 1 1 i => 0abc 100f 100i (0–7) (8–9) (8–9)
x x c 1 1 f 1 1 1 i => 100c 100f 100i (8–9) (8–9) (8–9)
Tugas
Ubah 10 bit DPD menjadi 3 digit desimal.
Uji kasus
DPD Decimal
0000000101 005
0001100011 063
0001111001 079
0000011010 090
0001011110 098
1010111010 592
0011001101 941
1100111111 879
1110001110 986
0011111111 999
1111111111 999 * Output is same regardless of the `x` bits
Memasukkan
Format input default adalah daftar 10 bit. Bit harus mengikuti urutan tepat di atas, atau kebalikannya. Anda dapat memilih untuk menggunakan representasi string atau integer yang setara. Tidak seperti tantangan saya yang lain, pemesanan ulang atau menggunakan struktur bersarang tidak diperbolehkan .
Untuk input [1, 1, 0, 0, 0, 1, 0, 1, 0, 0]
, format berikut diizinkan:
- Daftar bit:
[1, 1, 0, 0, 0, 1, 0, 1, 0, 0]
- Tali:
"1100010100"
- Binary integer:
788
atau0b1100010100
- Bilangan bulat desimal:
1100010100
- Terbalik:
[0, 0, 1, 0, 1, 0, 0, 0, 1, 1]
dan terbalik dalam format lain di atas
Format berikut ini TIDAK diizinkan:
- Penataan ulang bit secara sewenang-wenang:
[0, 0, 0, 0, 0, 1, 1, 1, 0, 1]
- Struktur bersarang:
[[1, 1, 0], [0, 0, 1], [0, 1, 0, 0]]
atau[0b110, 0b001, 0b0100]
Keluaran
Format output default adalah daftar 3 digit desimal. Setiap digit harus direpresentasikan sebagai 0 hingga 9, baik bilangan bulat atau karakter. Seperti pada input, Anda dapat memilih representasi string atau integer. Jika Anda memilih representasi integer, angka nol di depan dapat dihilangkan.
Kriteria penilaian & menang
Aturan standar kode-golf berlaku. Program atau fungsi terpendek dalam byte untuk setiap bahasa menang.
sumber
Python 3 ,
229 ... 9796 byteCobalah online!
-4 byte oleh @xnor
-6 bytes oleh @nwellnhof
Diformat:
Penjelasan
Karena saya awalnya ingin menerapkan ini dalam Jelly, saya mengambil pendekatan berbeda dari sebagian besar jawaban di sini, yang sederhana dan mungkin cocok untuk bahasa golf. Meskipun fungsi golf mengambil bilangan bulat, biarkan input sebagai daftar bit
[a0,a1,...,a9]
. Kemudian kita dapat memperoleh tiga nilai dari input[a2,a5,a9]
: Ini akan selalu menjadi bit rendah[d0,d1,d2]
masing - masing.[2*a0a1,2*a3a4,2*a7a8,8]
: Bit tinggi setiap digit akan menjadi salah satunya.[a3,a4,a5,a7,a8]
, menentukan cara mendapatkan bit tinggi dari setiap digit. Kami menghitung indikator (antara 1 dan 8) sebagai berikut:Kemudian digit ke-n dapat dihitung secara elegan seperti
high_bits[arr[indicator][n]] | low_bits[n]
pada tabel di bawah ini, yang dikompres menjadi string.sumber
b"..."
untuk mengganti konversi denganord
.b"$>6;-/'?"[a&8and(~a&6or a>>4&6|1)]
menyimpan empat byte lagi.JavaScript (Node.js) ,
126119117112111 byteCobalah online!
-5 byte terima kasih @tsh (dan 2 sendiri) Jadi
l
bisa melakukan lebih banyak usaha dari yang saya harapkan.-2 byte lebih banyak menggunakan teknik @ tsh!
-5 byte terima kasih @Arnauld
-1 byte terima kasih @Neil
Input sebagai daftar 10 bit (sebagai 10 argumen), output sebagai daftar 3 digit.
sumber
(!i|!d|e)
->i+l!=5
;(d|e|!h)
->h+l!=1
(g?h-i|h&!e?h?b:e:8:h*4+i*2)
->(g?h<i?e:h>i*e?b:8:h*4+i*2)
menyimpan byte lain. (Saya memeriksa kali ini ...)C (gcc) ,
138129 byteCobalah online!
Pertama mengekstrak beberapa bit ke dalam variabel
s
dant
, sehingga delapan baris tabel konversi dapat diidentifikasi oleh:Kemudian atur
u
danv
dengan divisi (shift kanan), sehinggau
,v
dan inputw
berisi tiga bit BCD yang lebih rendah di posisi 0-2. Sisanya agak mengocok tergantung padas
dant
. Dua trik penting adalah:Port solusi Javascript Shieru Asakoto hanya 124 byte :
Cobalah online!
sumber
f(b){int a=b/2%8,e=b&110,c=b/16,d=c/8;b=10*(10*(d%2|(6>a|78==e?d:8))+c%2+(3<a&a%2?e-46?8:d&6:c&6))+b%2+(4>a?b&6:a-5?a-6&&e-14?8:d&6:c&6)};
Ruby ,
153 ... 119117 byteCobalah online!
Bagaimana itu bekerja:
Ini adalah titik awal: konversikan ke BCD dengan menggeser 3 bit ke kiri, yang berfungsi untuk sebagian besar pola.
Dapatkan bit tengah dari masing-masing nibble (dan satu bit ekstra dari nibble ketiga, tetapi sembunyikan bit yang paling tidak signifikan).
Jika digit ketiga kurang dari 10 (kurang dari 9 karena kita tidak pernah merawat LSB), kita ditetapkan: ini adalah BCD biasa, kita dapat menampilkan hex tanpa mengubah apa pun
Kalau tidak, lakukan beberapa ilmu hitam dengan menggeser bit sekitar dan menambahkan angka ajaib sampai kita mendapatkan hasil yang kita inginkan.
sumber
Retina 0.8.2 ,
191181 byteCobalah online! Tautan termasuk kasus uji. Sunting: Disimpan 10 byte dengan tidak menambahkan digit ke 4 bit kecuali jika perlu. Penjelasan:
Masukkan pemisah sehingga setiap digit dapat dikonversi ke desimal secara terpisah. Ini secara efektif menangani dua kasus pertama dalam tabel konversi.
Tangani case (kedelapan) terakhir dalam tabel konversi.
Tangani case keenam dan ketujuh dalam tabel konversi.
Tangani case kelima di tabel konversi.
Tangani case ketiga dan keempat di tabel konversi.
Lakukan konversi biner ke desimal.
sumber
Jelly ,
51484039 byteCobalah online!
Algoritma
Dengan pengecualian indeks daftar, semua bilangan bulat di bagian ini ditulis dalam biner.
Kode
sumber
Python 2 , 157 byte
Cobalah online!
sumber
Bersih ,
238... 189 byte-2 byte terima kasih kepada Neil
Cobalah online!
Mengambil 'daftar' 10 bit dalam bentuk 10 argumen, menggunakan rumus langsung untuk menghitung hasilnya.
sumber
i*(9*e+19*d+i*...)
, yang keduai*
terlihat tidak perlu.Perl 5, 195 byte
Cobalah online
Saya tahu 195 byte terlalu banyak untuk kontes ini, tetapi saya tidak tahu bagaimana cara mengompres kode Perl lebih jauh. Saran?
Penjelasan kode
Dalam versi yang lebih mudah dibaca, niat kode harus menjadi jelas:
Dalam aturan untuk pengkodean DPD, setiap baris dikodekan ke dalam nilai 18 bit, segmentasi ke dalam (6,6, (2,2,2)) bit.
@p
untuk urutan 3-bit yang akan disambung menjadi bit 11-9, 7-5 dan 3-1 dari hasilnya.@p
dibangun dari bit 9-8, 6-5, 3-2 dari input, dan angka8
sebagai anggota keempatMisalnya, nomor pertama dalam daftar
16390
,, yang100000000000110
sebagai bidang bit, membawa informasi berikut:sumber
05AB1E , 84 byte
Jawaban Port of KimOyhus untuk 05AB1E
Cobalah online!
Penjelasan kasar:
sumber
05AB1E ,
104103101 byteJelas bukan bahasa yang tepat untuk tantangan semacam ini, tapi ah well ..
Input sebagai string, output sebagai daftar tiga digit.
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
Kami memiliki delapan skenario berikut untuk dipertimbangkan:
Saya pertama-tama membagi input (implisit) menjadi potongan ukuran
[2,1,2,1,3,1]
dan menyimpan daftar itu dalam register:Lihat ini 05AB1E ujung tambang (bagian Cara kompres bilangan bulat besar? ) Untuk memahami mengapa
•3γã•
adalah212131
Sekarang kita akan membangun 0s dan 1s untuk digit pertama dari output. Skenario 1,2,3,7 digunakan
'0'+1st+2nd
; dan skenario 4,5,6,8 gunakan'100'+2nd
:Kemudian kita akan membangun 0s dan 1s untuk digit kedua dari output. Skenario 1,2,4 digunakan
'0'+3rd+4th
; skenario 3,5,7,8 digunakan'100'+4th
; dan skenario 6 menggunakan'0'+1st+4th
:Kemudian kita akan membangun 0s dan 1s untuk digit ketiga dari output. Skenario 1,2 digunakan
5th+6th
; penggunaan skenario 3'0'+3rd+6th
; skenario 4,5 digunakan'0'+1st+6th
; dan skenario 6,7,8 digunakan'100'+6th
:Sekarang kita memiliki semua 0s dan 1s pada stack, jadi kita dapat mengubahnya menjadi tiga digit output:
sumber