Tulis fungsi atau program yang menyandikan string ke kode format barcode, di mana setiap karakter dikodekan sebagai lima batang yang dipisahkan oleh empat celah. Dua bar dan satu celah lebar dan yang lainnya sempit (kode 10 * 4), atau tiga celah lebar dan tidak ada balok yang lebar (4 kode). Ini memberikan 44 kode berbeda, dari yang mana kode cadangan yang digunakan untuk menunjukkan awal dan akhir dari string yang disandikan.
Tantangan
Input adalah string yang hanya berisi karakter dari set
1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ-. +/$%
Outputnya adalah string yang disandikan sebagai string barcode. Kesenjangan sempit dan kesenjangan antar karakter adalah ruang tunggal dan kesenjangan lebar adalah tiga ruang. Bilah sempit adalah urutan byte UTF-8 untuk karakter Unicode "Blok penuh", █, yaitu 0xE2 0x96 0x88
dan bilah lebar adalah tiga urutan / karakter byte tersebut ( ███
). Daftar kode lengkap adalah:
Spaces
0100 0010 0001 1000 1011 1101 1110 0111
Bars
00000 + / $ %
10001 1 A K U
01001 2 B L V
11000 3 C M W
00101 4 D N X
10100 5 E O Y
01100 6 F P Z
00011 7 G Q -
10010 8 H R .
01010 9 I S space 1=wide
00110 0 J T start/end 0=narrow
Bilah dan spasi disisipkan, dimulai dari bilah, jadi misalnya Q adalah
bar 0 0 0 1 1
code █ █ █ ███ ███
space 0 0 0 1
Setelah meng-encode semua karakter, string dibatasi pada kedua ujungnya dengan █ █ ███ ███ █
. Kesenjangan intercharacter, ruang tunggal, dimasukkan di antara setiap huruf. Solusi Anda dapat menampilkan spasi tambahan dan baris baru tambahan (dalam urutan itu).
Contohnya
"" → "█ █ ███ ███ █ █ █ ███ ███ █"
"A" → "█ █ ███ ███ █ ███ █ █ █ ███ █ █ ███ ███ █"
"C++" → "█ █ ███ ███ █ ███ ███ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ ███ ███ █"
"GOLF" → "█ █ ███ ███ █ █ █ █ ███ ███ ███ █ ███ █ █ █ ███ █ █ ███ █ ███ ███ █ █ █ █ ███ ███ █"
Format input / output standar diizinkan dan celah standar tidak diizinkan. Ini adalah kode-golf , jadi kode terpendek yang diukur dalam byte menang!
#
karakter, karena, misalnya,"#"
bukan satu-satunya alasan penggunaan karakter.Jawaban:
JavaScript (ES6),
225212 byteDisimpan 4 byte berkat @ l4m2
Cobalah online!
Bagaimana?
Tabel dapat disusun ulang sehingga topeng biner 9-bit karakter dengan cepat disimpulkan dari baris dan kolom menggunakan rumus berikut:
dengan:
sumber
s=>`#${s}#`.replace(/./g,c=>'0202020202'.replace(/./g,(j,k)=>[C='#',C+C+C,' ',' '][(i="%+/$U1AKV2BLW3CMX4DNY5EOZ6FP-7GQ.8HR 9IS#0JT".indexOf(c),[,257,260,5,272,17,20,320,65,68,80][i>>2]|(2<<i%4*2^(i<4)*170))>>k&1|j]))
(221)Merah ,
452445 byteCobalah online!
Saya akan mencoba untuk bermain golf lebih jauh, tetapi saya tidak berharap banyak dari solusi naif ini.
sumber
Java 10, 455 byte
Cobalah online.
Penjelasan:
sumber
C (gcc) ,
311, 303 byteCobalah online!
-8 Terima kasih untuk ceilingcat
Menggunakan strategi penyandian dari jawaban Arnauld. TIO termasuk tautan
-w
switch dan boilerplate untuk menghilangkan peringatan, ini tidak perlu dan dengan demikian tidak termasuk dalam skor.Selain dari skema pengkodean seperti yang dijelaskan oleh Arnauld, trik lain di sini adalah untuk mempertahankan
w
variabel sebagai toggling antara 2 dan 0 (w=2*!w
). Ini memungkinkan saya untuk memilih antara string pertama dan kedua dib
. Yang pertama adalah spasi, yang kedua adalah persegi panjang yang diisi.sumber
C (gcc) ,
241 239 227 213 213207 byteCobalah online!
Berdasarkan implementasi @ LambdaBeta .
Sedikit kurang golf:
sumber
Arang , 90 byte
Cobalah online! Catatan: Ruang tambahan. Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Bungkus string input dalam
*
s dan kemudian petakan di atasnya dua kali, akhirnya gabungkan hasilnya dengan spasi. Untuk peta kedua, kemudian ada peta tambahan pada rentang implisit0..4
, di mana dua substring digabungkan, dan hasil tersebut kemudian bergabung dengan konstanta string kosong yang telah ditentukan.Untuk peta bagian dalam pertama, buat string yang dibentuk dengan mengambil digit yang bertambah, alfabet huruf besar, dan simbol
-. *+/$%
, dan mencari posisi karakter input yang dipetakan. Misalnya,C++
akan memetakan ke[12, 40, 40]
.Substring pertama mewakili spasi sebelum bar. Tidak ada apa-apa sebelum bilah pertama, tetapi bilah lainnya tergantung pada posisi karakter input yang dipetakan: jika lebih dari 39, maka hanya satu tempat yang memiliki ruang tunggal, sedangkan jika di bawah 40, maka hanya satu tempat yang memiliki tiga spasi, dan posisinya juga dikonversi ke kolom dengan membaginya dengan 10. Jika kolom dan indeks loop berbeda dengan 2 (modulo 4) maka itu adalah tempat aneh.
Substring kedua mewakili bar. Jika posisinya di atas 39 maka selalu ada satu bar kalau tidak posisinya terlihat dalam array bit yang dipetakan ke karakter. Misalnya, jika posisinya 12, maka itu diindeks secara melingkar ke karakter
'
, yang100111
dalam bentuk biner, yang menunjukkan bilah lebar di kolom 1 dan 2. (Bagian depan1
diabaikan, itu hanya memastikan jumlah bit yang konsisten.)sumber
Perl 5 , 244 byte
Cobalah online!
Berisi banyak unsintables dan karakter byte tinggi, tautan TIO menyediakan
xxd
representasi. Saya berharap ini akan menjadi lebih kecil, dan saya mungkin masih bisa mengemas data dengan cara yang lebih efisien sehingga saya akan melihat bagaimana saya pergi. Ini membangun semua permutasi" "," ","█","███"
dan kemudian memetakan indeks daftar ke karakter yang sesuai.sumber
Haskell ,
275270 byteCobalah online!
Operator
x!n
yang menghitung digit x-base dari n, digunakan dua kali untuk mendekompres kode. Kode dikompresi terlebih dahulu sebagai string biner dengan lebar = 1 dan sempit = 0, tanpa memperhatikan warna, misalnyaR↔10000110↔262
. Angka-angka ini kemudian diurutkan dan dibedakan untuk mendapatkan angka dalam kisaran [3,66], yang dikompresi dengan kebalikan dari algoritma digit biner sebagai0x117CDBC49F9EEEF11C3A659CACB31236
. Ini hanya berisi setengah dari kode, sisanya adalah kebalikan dari ini.Tidak Terkumpul:
sumber