Terima kasih atas bantuan Anda dalam tantangan Mark My Mail , PPCG-Post telah berhasil mencap semua paketnya dengan barcode yang dihasilkan!
Sekarang, saatnya untuk memecahkan kode mereka.
Dalam tantangan ini, program Anda akan, dengan memberikan barcode yang dihasilkan dari tantangan Mark My Mail , mendekodekannya dan mengembalikan integer yang disandikan.
Tapi hati-hati! Barcode mungkin terbalik ...
Barcode 4-negara
Jika Anda melewatkan tantangan pengodean, Anda harus tahu jenis barcode apa yang sedang kita bicarakan. Barcode 4-negara adalah bar baris dengan empat kemungkinan status, masing-masing mewakili bilangan bulat basis-4:
| |
Bar: | | | |
| |
Digit: 0 1 2 3
Dirender dalam ASCII, barcode akan mengambil tiga baris teks, menggunakan karakter pipe ( |
) untuk mewakili bagian dari bar, dan spasi ( ) untuk mewakili bagian kosong. Akan ada satu ruang di antara setiap bar. Contoh barcode mungkin terlihat seperti ini:
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Untuk mengonversi kode batang kembali ke bilangan bulat yang disandikannya, petakan setiap bilah ke basis-4 digit yang sesuai, gabungkan ini, dan ubah menjadi desimal.
Karena setiap barcode juga akan mewakili barcode yang berbeda ketika terbalik, kami menerapkan urutan mulai / berhenti sehingga orienasi dapat dihitung. 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, mengingat barcode ASCII 4-state, menguraikannya dan mengembalikan integer yang dikodekannya - pada dasarnya kebalikan dari Mark My Mail .
Tapi untuk meningkatkannya, ada tangkapan - barcode mungkin terbalik. Seperti di dunia nyata, itu akan diserahkan kepada pembaca barcode (program Anda) untuk menentukan orientasi yang benar menggunakan urutan start / stop.
Contoh:
Diberikan barcode berikut:
| | | | | | | | | | | | | | | | | | | |
Kita dapat dengan jelas melihat bahwa pasangan angka pertama dan terakhir adalah 0, 2
dan bukan 1, 0
. Ini berarti bahwa barcode terbalik - jadi kita harus memutarnya 180 derajat (tidak hanya membalik setiap batang) untuk mencapai orientasi yang benar:
| | | | | | | | | | | | | | | | | | | |
Sekarang, kita dapat memulai decoding. Kami memetakan setiap bilah ke basis-4 digit yang sesuai, mengabaikan urutan mulai / berhenti karena mereka tidak menyandikan data.
| | | | | | | | | | | | | | | | | | | | - - 2 1 0 3 0 2 3 - -
Kami menggabungkan ini ke integer basis-4 2103023
, lalu mengonversinya menjadi representasi desimal 9419
untuk hasil akhir.
Aturan
- Input akan selalu berupa barcode 4-negara yang valid, yang diberikan dalam ASCII sebagaimana dijelaskan di atas, dengan urutan mulai / henti yang dijelaskan.
- Anda dapat meminta spasi tambahan, atau garis stripping, serta baris baru tambahan - format apa pun yang sesuai dengan golf Anda.
- Mungkin atau mungkin tidak dalam orientasi yang benar - program Anda harus menentukan apakah akan membacanya terbalik, dengan menggunakan urutan start / stop.
- Ini tidak akan menyandikan angka nol di bilangan bulat basis-4.
- Anda dapat mengambil input sebagai daftar baris, atau string dengan baris baru.
- Outputnya harus berupa bilangan bulat di basis integer standar bahasa Anda, mewakili data yang disandikan oleh barcode.
- Karena prangko berukuran kecil dan dapat memuat kode yang sangat sedikit, kode Anda harus sesingkat mungkin: ini adalah kode-golf - sehingga program terpendek (dalam byte) menang!
Uji Kasus
| | | | | | | | | | | | | |
= 4096 (terbalik)
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
= 7313145 (terbalik)
| | | | | | | | | | | | | | | | | | | |
= 9419 (dibalik)
| | | | | | | | | | | | | | | | | | |
= 990 (tidak terbalik)
| | | | | | | | | | | | | | | | | | |
= 12345 (tidak terbalik)
[String]
,[{#Char}]
,[{Char}]
,[[Char]]
?, Mengingat bahwaString
ini setara dengan{#Char}
Jawaban:
Jelly , 18 byte
Cobalah online!
sumber
Sekam , 16 byte
Cobalah online!
Input adalah daftar baris (tautan TIO menggunakan string multiline untuk kejelasan). Garis harus memiliki panjang yang sama, dan tidak boleh ada spasi tambahan.
Penjelasan
sumber
SOGL V0.12 ,
4032 byteCoba Di Sini!
sumber
Python 2 ,
113105 byteCobalah online!
sumber
Python 2 , 96 byte
Cobalah online!
sumber
Retina , 71 byte
Cobalah online! Tautan mencakup test case yang lebih kecil. Membutuhkan garis pertama dan terakhir harus berlapis ruang hingga panjang garis tengah. Penjelasan:
Hapus spasi yang tidak perlu.
Membalikkan karakter dalam kode, tetapi jika kode batang dimulai dengan
|
, maka pilih seluruh kode, jika tidak pisahkan menjadi karakter. Kemudian, balikkan. Ini membalik kode jika dimulai dengan a0
.Hapus urutan mulai / hentikan dan baris tengah (yang tidak berguna bagi kami).
Ubah spasi dan
|
s dari basis 4 ke unary.Gandakan baris terakhir.
Konversikan ke desimal.
sumber
Java (OpenJDK 8) ,
181160 byteTidak terlalu buruk untuk solusi java, saya yakin ada optimisasi yang bisa saya buat, tapi saya sudah terlalu lama melihatnya.
Kurangi beberapa byte dengan memperpendek loop daripada menggunakan substring.
Golf
Cobalah online!
Tidak disatukan
sumber
l+~i
alih-alihl-1-i
Java 8 ,
208166157151 byteCobalah, mungkin bisa lebih baik, dikurangi 42 karena cek yang tidak perlu, -9 menghapus variabel, -6 terima kasih kepada Luke Stevens
Masukan adalah a
char[][3]
ungolfed:
sumber
Bersih ,
191...161144 byteCobalah online!
sumber
Pip ,
464342 byteMengambil baris barcode sebagai tiga argumen baris perintah. Baris pertama dan ketiga harus diisi dengan panjang baris kedua dengan spasi. Cobalah online!
Penjelasan
Pertama beberapa persiapan:
Sekarang amati bahwa jika kita mengabaikan baris tengah dan memperlakukan
0, setiap bilah hanyalah angka biner 2-bit:
|
sebagai 1 dansumber
Sekam ,
3938 byteMengambil input sebagai daftar string: Cobalah online atau coba test-suite!
Penjelasan
sumber
Perl 5 , 152 + 2 (
-F
) byteCobalah online!
sumber
Oktaf ,
807568 byteCobalah online!
Anehnya,
bi2de
default MSB di kanan daripada kiri, menyebabkan beberapa sakit kepala sementara saya membuat ini ... saya pikir saya harus memiliki cara optimal membalik array sebelum mengindeks itu, tetapi ada sangat banyak cara untuk melakukannya ( baik dalam pengindeksan pertama, atau denganflipud
,fliplr
,rot90
,'
(transpose), pengindeksan akhir ...). Mengambil array persegi panjang dengan spasi dan|
s (jadi, dibutuhkan spasi tambahan)sumber
JavaScript (ES6),
184181 byteSaya bukan pegolf berpengalaman - saya yakin ini bisa ditingkatkan, tetapi saya menyukai tantangan ini! Saya selalu bertanya-tanya tentang tanda-tanda itu.
Fungsi
f
mengambil daftar string dengan spasi tambahan yang dibutuhkan. Baris baru ditambahkan ke kode di bawah ini untuk kejelasan (tidak termasuk dalam jumlah byte).Pemakaian
Versi tidak dikoleksi dengan penjelasan
sumber