Hampir setiap toko saat ini menggunakan barcode Kode Produk Universal (UPC) untuk menyederhanakan proses pemeriksaan. Jika nama itu tidak berarti apa-apa bagi Anda, Anda pasti akan mengenali seperti apa tampilannya:
Format
Sistem yang paling umum adalah UPC-A, yang menggunakan 12 digit untuk mewakili setiap produk tertentu. Setiap digit dikodekan ke dalam serangkaian garis-garis hitam dan putih untuk memungkinkan mesin membaca kode, panjang tujuh bit. Ada total pola senilai 11 bit yang menunjukkan awal, tengah, dan akhir barcode. Ini mencapai total panjang barcode 12 × 7 + 11 = 95 bit. (Mulai sekarang, ketika biner digunakan untuk merujuk pada warna setiap bit, 0
berwarna putih dan 1
hitam.)
Awal dan akhir keduanya memiliki pola 101
. Digit-digit tersebut kemudian dibagi menjadi 2 kelompok dengan 6 dan dikodekan seperti yang ditunjukkan di bawah ini, dengan pola 01010
antara kelompok kiri dan kanan. Tabel ini mencantumkan pola untuk setiap nomor. Perhatikan bahwa polanya berbeda tergantung pada apakah digit berada di sisi kanan atau kiri (Ini memungkinkan barcode dipindai secara terbalik). Namun, pola untuk kanan adalah kebalikannya (swap hitam untuk putih dan sebaliknya) dari pola kiri.
Jika Anda tidak dapat melihat gambar di atas, ini adalah setara biner masing-masing angka.
# Left Right
0 0001101 1110010
1 0011001 1100110
2 0010011 1101100
3 0111101 1000010
4 0100011 1011100
5 0110001 1001110
6 0101111 1010000
7 0111011 1000100
8 0110111 1001000
9 0001011 1110100
Contoh
Katakanlah Anda memiliki UPC 022000 125033
. (Itu bukan angka acak. Berikan komentar jika Anda mengetahui signifikansinya.) Anda mulai dengan pelat ini yang sama di setiap barcode:
101xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx01010xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx101
Untuk digit, Anda ganti masing-masing dengan pengkodean yang sesuai untuk sisi (kiri atau kanan) yang aktif. Jika Anda masih bingung, lihat gambar di bawah ini.
Berikut ini adalah output dalam biner dengan |
pipa yang memisahkan bagian-bagiannya.
101|0001101|0010011|0010011|0001101|0001101|0001101|01010|1100110|1101100|1001110|1110010|1000010|1000010|101
Tantangan
Tulis program yang mengeluarkan kode batang UPC-A untuk input pengguna. Dimensi gambar harus 95 × 30 piksel, dengan masing-masing "bit" berukuran satu piksel dan tinggi 30 piksel. Garis-garis hitam dalam rgb(0, 0, 0)
dan garis-garis putih transparan atau konsisten rgb(255, 255, 255)
.
Catatan
- Ambil input dari stdin atau baris perintah, atau tulis fungsi yang mengambil string atau integer (perhatikan bahwa input dapat memiliki angka nol di depan, dan sebagian besar bahasa menghapusnya atau mengonversi angka menjadi oktal).
- Keluarkan gambar dengan salah satu cara berikut:
- Simpan ke file dengan nama dan format (PNG, PBM, dll.) Pilihan Anda.
- Tampilkan di layar.
- Keluarkan data file-nya ke stdout.
- Anda mungkin tidak menggunakan pustaka atau builtin yang menghasilkan barcode ( saya melihat Anda, Mathematica ), meskipun Anda dapat menggunakan pustaka gambar atau grafik.
- Digit terakhir dari UPC biasanya digit periksa , tetapi untuk tujuan ini Anda tidak perlu khawatir.
Contohnya
Berikut adalah beberapa contoh untuk menguji kode Anda. Output biner juga diberikan untuk kenyamanan.
Memasukkan: 012345678910
Keluaran:
10100011010011001001001101111010100011011000101010101000010001001001000111010011001101110010101
Memasukkan: 777777222222
Keluaran:
10101110110111011011101101110110111011011101101010110110011011001101100110110011011001101100101
Mencetak gol
Ini adalah kode golf , jadi pengiriman terpendek (dalam byte menang). Tiebreaker pergi ke pos paling awal.
sumber
["777777","222222"]
Jawaban:
CJam,
5857 byteMencetak Bitmap Portable (ASCII) ke STDOUT. Cobalah online.
Bagaimana itu bekerja
sumber
Rev 1 BBC BASIC, 155 ascii chars, tosize filesize 132 bytes
menyimpan beberapa byte dengan memasukkan offset 43 ke dalam
i
loop. Agar tidak melanggarMOD2
47 tambahan harus ditambahkan untuk total 90.Ini memindahkan kode batang lebih jauh dari asalnya, seperti yang ditunjukkan, jika itu dapat diterima:
Rev 0 BBC BASIC, 157 ascii chars, tosize filesize 137 bytes
Unduh juru bahasa di http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
Mode layar default adalah teks hitam dengan latar belakang putih. Ini berbeda dari BASC BBC asli.
Versi tidak disatukan dengan pencetakan tes
Perhitungan bilah data tergantung pada
IF j<42
dan semua harus dilakukan pada satu baris. Dalam versi yang tidak disunat itu dilakukan dalam tiga langkah. Dalam versi golf, dua langkah terakhir digabungkan menjadi satu ekspresi besarp=...
Saya harus membalik urutan bitmap, karena saya gunakan
>>(j MOD 7)
untuk mengakses bit, yang berarti saya mengakses bit paling tidak penting terlebih dahulu. Setelah ini selesai, semua bitmap kiri dengan nyaman berada dalam kisaran ASCII.Output khas, versi tidak disatukan, dengan output tes
sumber
JavaScript ES6, 225 byte
Bisa lebih pendek dengan fitur ES7 tapi saya tidak yakin tentang dukungan mereka jadi saya tetap dengan ES6. Saya juga mengasumsikan input sebagai array. Outputnya adalah file PBN . Ada banyak golf yang bisa dilakukan.
Jika saya melakukan kesalahan tinggalkan komentar dan saya pasti akan memperbaikinya
sumber
Perl, 153 byte
Salin ke file barcode.perl lalu jalankan seperti ini:
kemudian masukkan nomor barcode.
Penjelasan:
Pola bit untuk digit barcode disimpan dalam string dan diganti dengan digit input menggunakan
y///
operator transliterasi Perl . Setiap nilai dalam string substitusi memiliki 48 (ASCII '0') yang ditambahkan darinya, untuk menghindari karakter yang tidak diinginkan. Digit di bagian kedua dari barcode adalah kebalikan dari yang ada di bagian pertama.Pola pusat diatur ke 0000000 (pola yang jika tidak bisa tidak pernah muncul, dikodekan sebagai 'A' dan kemudian '0') dan kemudian diganti dengan 01010 daripada menangani panjang yang berbeda sebagai kasus khusus saat
sprint
ing.sumber
Oktaf, 115 byte
Versi multi-baris:
n
adalah ASCII setara dengan kode digit sisi kanan (mereka lebih mudah untuk masuk daripada sisi kiri karena semuanya karakter yang dapat ditampilkan). Setelah itu, konversi desimal ke biner langsung dengan beberapa perubahan tipe yang menjengkelkan dari char ke numeric.v
membangun string biner terakhir dan kemudian kita ulangi 30 kali dan output ke konsol.Output sampel dengan hanya 2 dari 30 baris yang ditampilkan untuk singkatnya:
Output terkompresi:
Saya awalnya bermaksud untuk menampilkan gambar, tetapi mengirimkan output ke konsol menyelamatkan saya 9 byte. Anda dapat menampilkan hasil menggunakan
imshow
, tetapi ini ditampilkan1
sebagai putih dan0
hitam, jadi Anda harus membalikkan data terlebih dahulu.sumber
Cobra - 218
sumber
Javascript ES6, 199 byte
sumber
Python 2, 174 byte
Saya tahu itu bisa bermain golf.
String
s
adalah tabel biner dalam pertanyaan dengan bagian kiri dari tabel sebagai bagian kiri dari string. Nilai-nilai adalah ANDed oleh 63 pertama jika di bagian kanan (hapus pertama 1), kemudian digeser oleh 63 untuk dicetak ASCII.BUG: Saat ini sedang mencoba untuk memperbaiki bug. Output dari contoh pertama dimatikan oleh satu digit barcode. Jika Anda mengetahuinya, beri tahu saya.
sumber