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 bahwa String
ini setara dengan{#Char}