Barcode 4-negara
Banyak layanan pos (Royal Mail UK, Canada Post, US Mail, dll) menggunakan barcode 4-negara untuk menyandikan informasi tentang email mereka. Diberikan dalam ASCII, mungkin terlihat seperti ini:
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Barcode 4-negara adalah deretan bar. Setiap bilah dapat diperpanjang ke atas, ke bawah, atau keduanya, memungkinkan 4 kemungkinan. Ini berarti bahwa setiap bilah pada dasarnya mewakili basis 4 digit:
| | Bar: | | | | | | Digit: 0 1 2 3
Masalah dengan simbologi ini adalah bahwa setiap barcode adalah barcode terbalik yang valid dan berbeda: secara drastis mengubah makna jika orientasinya salah. Oleh karena itu, urutan mulai dan berhenti biasanya diterapkan sehingga pemindai dapat menghitung ke mana seharusnya dibaca.
Untuk tujuan tantangan ini, kami akan menggunakan urutan start / stop yang ditentukan oleh Australia Post: setiap barcode dimulai dan diakhiri dengan 1 0
urutan.
Tantangan
Tugas Anda adalah menulis sebuah program atau fungsi yang, diberi bilangan bulat positif N
, mengubahnya menjadi barcode ASCII 4-state, di mana setiap bilah (kecuali untuk urutan start / stop) mewakili angka dalam representasi basis-4 dari N
.
Contoh:
Dengan bilangan bulat 19623
, pertama-tama kita akan mengubahnya menjadi representasi basis-4 10302213
,.
Kami kemudian akan memetakan setiap digit ke bilah yang sesuai:
1 0 3 0 2 2 1 3 | | | | | | | | | | | | | | | |
Akhirnya, kami akan menambahkan urutan start / stop:
Mulai: Akhir: 1 0 1 0 | | | | | | | | | | | | | | | | | | | | | |
Barcode yang dihasilkan harus menjadi output program.
Aturan:
- Input akan berupa bilangan bulat positif, dalam kisaran ukuran bilangan bulat standar bahasa Anda.
- Hasil:
- Bisa berupa daftar baris, atau string yang berisi baris baru.
- Dapat berisi baris / spasi depan atau akhir, asalkan bentuknya tetap utuh.
- Harus memperlihatkan kode batang dengan format di atas - harus menggunakan karakter pipa (
|
) dan karakter spasi () saat menggambar bilah, dan harus ada 1 spasi di antara setiap bilah tegak.
- Ini adalah kode-golf , jadi program terpendek (dalam byte) menang!
Uji Kasus
4095:
| | | | | | | | | | | | | | | | | | | | | | | |
4096:
| | | | | | | | | | | | | |
7313145:
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
sumber
Jawaban:
Python 3 ,
1039996 byteCobalah online!
sumber
MATL ,
34302928 byteCobalah online!
Penjelasan
sumber
Jelly ,
1615 byteCobalah online!
Bagaimana itu bekerja
sumber
.......
tetapi setiap titik mewakili byte yang berbeda.Jelly , 19 byte
Cobalah online!
-1 terima kasih kepada Tn . Xcoder .
sumber
Oktaf ,
78 77 75 74 7069 byteCobalah online!
Berbeda dengan pendekatan asli, yang satu ini menggunakan tabel pencarian sederhana untuk memetakan nilai basis-4 ke dalam persamaan binernya. Tabel pencarian juga menambahkan spasi antara setiap bilah dengan menambahkan nol di antara setiap bilangan (yang memetakan ke bilah semua spasi).
Tabel pencarian langsung memetakan ke bar sebagai:
Konversi dari biner ke
|
dansekarang dilakukan dengan mengindeks ke dalam string dari dua karakter - pada dasarnya prinsip yang sama dengan tabel pencarian untuk konversi biner.
* Disimpan 1 byte, terima kasih @LuisMendo
Asli:
Cobalah online!
Fungsi anonim yang mengembalikan kode batang sebagai string.
Ini didasarkan pada fakta bahwa jika kita menambahkan 4 ke angka base4, maka kita dapat mewakili bar / spasi dengan jumlah yang dikonversi menjadi biner dengan bit 1 dan 2 yang ditukar:
Bagian yang sulit dari perspektif golf adalah menambahkan spasi di antara bar dan mengubah dari
0/1
menjadi'|'/' '
.sumber
JavaScript (ES6),
898783 byteUji kasus
Tampilkan cuplikan kode
Bagaimana?
NB : Dalam versi di bawah ini, literal template telah diganti dengan string standar sehingga kode dapat diindentasi dengan benar.
sumber
R ,
154109 byteCobalah online!
Menyimpan sejumlah byte dengan mengindeks dan menggunakan
cat
daripada membangun matriks dan menggunakanwrite
, serta 6 dari konversi yang sedikit berbeda ke basis 4. Mencetak dengan ruang terdepan di setiap baris dan tidak mengikuti baris baru.Pengindeksan berlangsung menggunakan beberapa aritmatika modular, tidak seperti beberapa jawaban lain, tetapi karena R menggunakan pengindeksan berbasis 1, aritmatika agak berbeda.
Penjelasan:
sumber
Arang , 50 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Masukkan nomor.
Dorong urutan berhenti ke daftar kosong yang telah ditentukan.
Jika angkanya positif,
berulang kali terapkan divmod untuk mengubahnya menjadi basis 4 yang dibalik,
kalau tidak, cukup dorong saja.
Dorong urutan mulai ke daftar.
Petakan lebih dari tiga string. Setiap string mewakili terjemahan barcode untuk digit
0123
untuk setiap baris.Peta di atas digit (dibalik kembali menjadi urutan yang biasa), ubah menjadi bar atau spasi menggunakan terjemahan, kemudian gabungkan hasilnya menjadi tiga string yang kemudian dicetak secara tersirat pada baris yang berbeda.
sumber
Japt ,
3231 byteUji secara online!
Belum benar-benar puas dengan ini, tapi ini awal ...
Penjelasan
sumber
Haskell ,
9190 byteCobalah online! Mengembalikan daftar garis.
Alternatif jumlah byte yang sama untuk baris pertama:
sumber
J ,
57 4947 byte10 byte berkat FrownyFrog!
Bagaimana itu bekerja:
1 0,4&#.inv,1,0:
- Mengonversi angka menjadi daftar digit basis-4, menambahkan 1 0 ke awal dan akhir daftar((#:2 6 3 7){' |')
- tabel pencarian untuk enkripsi, biner 0 sesuai dengan ruang, 1 hingga '|'{~
- mengenkripsi digit basis 4 dengan memilih string dari tabel pencarian di atas (argumen dibalik)|:
- transpos array yang dihasilkan dari 3 kolom ke 3 baris[:
- tutup garpu,.2{."0
- Menempatkan spasi di antara barCobalah online!
sumber
APL + WIN, 63 byte
Penjelasan:
sumber
Python 2 ,
116114 byte-2 byte terima kasih kepada notjagan
Cobalah online!
sumber
05AB1E , 19 byte
Cobalah online!
Ini adalah setengah port dari pendekatan Dennis, yang hanya satu byte lebih pendek dari metode yang saya gunakan sebelumnya (yang saya cukup senang):
05AB1E , 20 byte
Cobalah online!
Bagaimana itu bekerja?
Saya telah bertanya kepada Adnan (pembuat 05AB1E) tentang grid thingy dalam obrolan , dan mereka membantu saya menghemat 2 byte, dengan menunjukkan fitur 05AB1E: ketika bergabung dengan daftar multi-dimenisional oleh baris baru, daftar dalam digabung menggunakan spasi juga , jadi
ðý
tidak perlu.sumber
APL (Dyalog Classic) , 33 byte
Cobalah online!
sumber
2⊥⍣¯1
bagaimana Anda akan mendapatkan daftar biner?2⊥⍣¯1
apakah kebalikan ("terbalik"?) Dari "dua-decode". Ini dikodekan ke dalam biner dengan bit yang diperlukan.J ,
42 4039 byteBercukur 2 byte berkat Dennis. 1 byte berkat ngn.
Cobalah online!
Bagaimana itu bekerja
sumber
JavaScript (ES6) 79 byte
Menggunakan .toString untuk mengonversi angka menjadi basis 4, dan kemudian bekerja dengan masing-masing baris dan bitwise ATAU untuk membangun garis keluaran demi baris. Menghasilkan daftar garis.
sumber
`10${n.toString(4)}10`
:)Bash + coreutils,
7167 byteCobalah online!
Penjelasan
The
dc
bit bertobat ke basis 4, mengawali dan menambahkan dengan4
(bergantian ke10
dalam output) dan menggunakann
untuk menjaga semuanya dalam satu baris.Sisanya terjadi di
sed
:sumber
x
ruang palka / pola di sekitarnya untuk memodifikasinya dan kemudian melakukans
semuanya sekaligus, dan tidak ada yang berakhir lebih pendek.Retina , 83 byte
Cobalah online! Tautan termasuk kasus uji lebih cepat. Penjelasan:
Konversikan ke unary.
Konversikan ke basis 4 sebagai angka unary yang dipisahkan oleh
;
s.Tambahkan urutan mulai.
Tambahkan a
;
, mengubahnya menjadi digit terminator daripada separator, dan urutan berhenti.Konversikan ke desimal, tetapi tambahkan 1 ke setiap digit.
Rangkap tiga itu.
Di baris pertama,
1
s dan3
s (mewakili0
s dan2
s) menjadi spasi.Di baris terakhir,
1
s dan2
s (mewakili0
s dan1
s) menjadi spasi.Semua digit lainnya menjadi bilah.
sumber
Pip ,
3331292726 byte25 byte kode, +1 untuk
-S
bendera.Cobalah online!
Penjelasan
Kami mengamati pola dalam empat jenis batang:
Begitu:
sumber
SOGL V0.12 , 28 byte
Coba Di Sini!
sumber
C (gcc) , 176 byte
Cobalah online!
Sedikit kurang terformat (kurang golf):
Penjelasan
Pertama, pertimbangkan kode berikut untuk membaca integer dan mengeluarkan versi basis 4:
Ini menggunakan rekursi ekor untuk membalik urutan output. Setiap langkah rekursif bithifts oleh 2 (memotong 2 bit terakhir dan membaginya dengan 4). Ini output hasil bitmasked dengan 3 (0b11), yang hanya menunjukkan dua bit terakhir, yang merupakan basis digit terakhir 4.
Panggilan fungsi termasuk dalam
printf
argumen sebagai trailing (tidak dicetak, tetapi dievaluasi) untuk menghindari keharusan menggunakan {} (+2 byte) untuk mengelompokkanprintf
dan panggilan fungsi.Solusi di sini memperluas kode base-4 ini. Pertama, m didefinisikan sebagai n, tetapi sedemikian rupa sehingga pada basis 4 ia akan memiliki 10 prepended dan ditambahkan padanya. Kami kemudian mencetak m.
Dalam mencetak basis 4 secara teratur, kami menggunakan bitmask 3 untuk mendapatkan digit. Dalam kode email, baris teratas adalah bit orde rendah digit itu (bitmask 1) dan intinya adalah bit orde tinggi (bitmask 2). Oleh karena itu,
r
inf(n,r)
adalah bitmask - fungsi utama kami memanggilf(m,1)
untuk baris pertama danf(m,2)
baris terakhir.Untuk membuat garis tengah berfungsi (selalu cetak "|"), kami menambahkan
||!r
ke kondisi - jika r adalah 0, itu akan selalu mengevaluasi ke true dan mencetak "|". Kemudian kita memanggilf(m,0)
garis tengah.Akhirnya, kami ingin baris baru berperilaku. Termasuk tambahan
printf
itu mahal sejauh byte kode sumber berjalan, jadi alih-alih kita tambahkan% c specifier ke yang sudah adaprintf
.n?32:10
mencetak baris baru jika n adalah 0 (false), dan spasi jika tidak. 32 dan 10 digunakan sebagai ganti '\ n' dan '' untuk menyimpan byte.sumber
f(n,r){n&&f(n>>2);printf("%c%c",n?32:10,(n&r|!r)&&n?'|':32);}main(n){scanf("%d",&n);f(n=(n+(4<<(32-__builtin_clz(n)/2*2)))*16+4,1);f(n,0);f(n,2);}
Common Lisp, 191 byte
Cobalah online!
sumber
PHP, 99 +1 byte
membutuhkan PHP> = 5.5 untuk pengindeksan string literal dan <7.1 agar pengindeksan tidak menghasilkan peringatan.
Jalankan sebagai pipa dengan
-nR
atau coba online .Masukkan satu baris lagi untuk mendapatkan baris tambahan.
sumber
Python 2,
142126 byteTerima kasih banyak untuk teman-teman!
Saya mencoba untuk tidak menyalin metode jawaban lain dan ... huek.
sumber
C # (.NET Core) , 160 byte
Cobalah online!
Saya yakin saya telah melewatkan beberapa peningkatan.
DeGolfed
t<51 & y != 1 & t-(y>>1) != 49
memeriksa apakah char bukan '3', bukan baris kedua, dan kemudian beberapa binary magic untuk melihat apakah baris pertama atau ketiga harus berisi spasi.sumber
Zsh ,
156154151133 byteCobalah online!
Mengambil input basis-10 dari var
$x
sumber
Japt , 42 byte
Cobalah online!
sumber
Pyth , 32 byte
Coba di sini!
sumber
C, 120 byte
Sayangnya hanya berfungsi pada Windows, karena
itoa
terlalu nyaman untuk menjadi standar.sumber