Pengkodean Manchester adalah protokol telekomunikasi yang digunakan dalam komunikasi radio yang menjamin transisi bit secara berkala sehingga penerima dapat memulihkan laju jam dari data itu sendiri. Ini menggandakan bitrate, tetapi murah dan mudah diimplementasikan. Ini banyak digunakan oleh operator radio amatir.
Konsepnya sangat sederhana: pada tingkat perangkat keras, jam dan jalur data secara sederhana disatukan. Dalam perangkat lunak, ini digambarkan sebagai mengubah aliran input bit ke aliran output laju ganda, dengan setiap input '1' diterjemahkan ke '01' dan setiap input '0' diterjemahkan ke '10'.
Ini adalah masalah yang mudah, tetapi terbuka untuk banyak implementasi karena sifat bitstreamnya. Artinya, pengkodean secara konseptual adalah proses bit-by-bit, bukan proses byte-by-byte. Jadi kita semua sepakat pada endianness, bit input paling tidak signifikan menjadi byte paling signifikan dari output.
Waktu bermain golf! Tulis fungsi yang, diberikan array panjang byte yang sewenang-wenang, mengembalikan array dari manchester data yang disandikan.
Input dan output harus dianggap little-endian, byte paling signifikan pertama, dan BIT paling signifikan pertama dalam bit stream.
Gambar bitstream ASCII :
bit # 5 4 3 2 1 0 5 4 3 2 1 0
IN ------- 1 0 1 0 1 1 ---> [manchester encoder] --- 01 10 01 10 01 01 ----> OUT
Contoh :
Example 1 (hex):
LSB MSB <-- least sig BYTE first
IN : [0x10, 0x02]
OUT: [0xAA, 0xA9, 0xA6, 0xAA]
Example 1 (binary):
msb lsb msb lsb <-- translated hex, so msb first
BIN: [00010000, 00000010] <-- least sig NIBBLE...
BIN: [10101010, 10101001, 10100110, 10101010] <-- becomes least sig BYTE
LSB MSB
Example 2
IN : [0xFF, 0x00, 0xAA, 0x55]
OUT: [0x55, 0x55, 0xAA, 0xAA, 0x66, 0x66, 0x99, 0x99]
Example 3
IN : [0x12, 0x34, 0x56, 0x78, 0x90]
OUT: [0xA6, 0xA9, 0x9A, 0xA5, 0x96, 0x99, 0x6A, 0x95, 0xAA, 0x69]
Example 4
IN : [0x01, 0x02, 0x03, 0xF1, 0xF2, 0xF3]
OUT: [0xA9, 0xAA, 0xA6, 0xAA, 0xA5, 0xAA, 0xA9, 0x55, 0xA6, 0x55, 0xA5, 0x55]
Aturan :
- Solusi hanya membutuhkan algoritma untuk mengkonversi input ke output.
- Mendapatkan input dan output cetak BUKAN merupakan bagian yang diperlukan dari solusi, tetapi dapat dimasukkan Anda disarankan untuk memberikan kode uji / cetak Anda jika tidak termasuk dalam solusi Anda.
- Input adalah larik byte 8-bit (apa pun artinya dalam bahasa pilihan Anda), BUKAN string teks. Anda dapat menggunakan string sebagai format penyimpanan jika sesuai dengan bahasa Anda, tetapi karakter yang tidak dapat dicetak (mis. 0xFF) harus didukung. Input juga bisa memakan waktu lama jika perlu.
Memori untuk keluaran harus dialokasikan oleh rutinitas Anda, bukan disediakan.sunting: persyaratan yang tidak perlu- Output juga merupakan array byte 8-bit, dan panjang jika perlu.
- Harus mendukung setidaknya 16KB input
- Kinerja tidak boleh terlalu mengerikan: <10s untuk 16KB
- Byte terkecil-signifikan pertama dalam memori.
Tantangan saluran samping :
- Tantang jawaban pengguna lain dengan membuktikan kode Anda lebih cepat, lebih hemat memori, atau menghasilkan biner yang lebih kecil!
Jawaban:
GolfScript 28 karakter
Versi yang setara tanpa optimasi yang membingungkan:
Kode menerima input sebagai array bilangan bulat, dan kembali ditto.
Untuk setiap angka dalam array angka dikonversi ke bentuk array basis 2, kemudian dikonversi kembali ke angka seolah-olah itu basis 4, ini memiliki efek jarak bit dengan 0 di antara masing-masing. 43691 kemudian dikurangi dari angka, dan hasilnya adalah biner terbalik, ini setara dengan mengurangi angka dari 43690 (43690 = 0b101010101010101010). Angka tersebut kemudian dibagi menjadi dua bagian dengan mengubahnya menjadi array 256 basis, array didekomposisi dan urutan dua angka yang dihasilkan dibalik.
Input contoh:
Contoh output:
sumber
{2{base}:|~4|43691-~256|~p p}%
c - 224 karakter
Saya percaya bahwa ini fungsional, termasuk alokasi kebutuhan memori sejak dijatuhkan.
Bagian yang berfungsi dari kode adalah loop atas bit masing-masing karakter, mencatat bahwa ((bit + 1) eksklusif-atau 3) adalah pasangan bit output, dan menerapkan banyak logika shifting dan masking untuk membuat semuanya berbaris.
Seperti halnya c, ia bekerja pada data sebagai karakter. Scaffold tes tidak akan menerima 0 byte (karena c memperlakukannya sebagai string mengakhiri), tetapi kode kerja tidak memiliki batasan seperti itu.
Mungkin golf sedikit lebih banyak dengan menyalin pekerjaan konversi byte inline.
Uji coba (dengan perancah uji yang ditingkatkan):
Berkomentar, lebih sedikit ketergantungan mesin, dan dengan scaffold uji
sumber
J, 36
Garis besar penjelasan (Lihat J Kosakata untuk referensi):
,@:(3 :'...'"0)
menerapkan ... untuk setiap input "byte" sebagai y, menghasilkan masing-masing dua byte (integer). Hasilnya diratakan oleh,
.y#:~8#2
setara dengan2 2 2 2 2 2 2 2 #: y
, atau vektor dari 8 basis-2 digit paling signifikan dari y.4|.
menukar depan dan belakang 4 bit dengan memutar 4 posisi.(,.~-.)
setara dengan3 :'(-. y) ,. y'
, atau tidak dari argumen 'dijahit' ke argumen (mengambil bentuk 8 2).#.2 8$,
ratakan hasilnya dengan memberikan bitstream, membentuk kembali menjadi 2 baris 8, dan mengkonversi dari basis 2.Contoh penggunaan (J, interaktif):
Informasi kecepatan (J, interaktif):
Berarti waktu untuk 16kb hanya di bawah 0,25s, Intel Core Duo 1,83Ghz atau serupa.
sumber
Haskell, 76 karakter
Tes berjalan:
Performa baik dalam spesifikasi. pada 1MB di ~ 1.2s pada laptop lawas saya. Itu menderita karena input dikonversi ke dan dari daftar, daripada diproses sebagai
ByteArray
.Sumbernya, 2040-Manchester.hs , termasuk kode, tes, dan fungsi utama untuk filter baris perintah.
sumber
OCaml + Baterai,
138117 karakterTes:
Dengan
Hasilnya adalah:
Sebagai patokan, dengan:
Saya mendapat:
di MacBook saya.
sumber
Python, 87 karakter
M
adalah fungsi yang diminta dalam masalah. Ini panggilanN
untuk setiap nybble dan menyambungkan semuanya kembali ke daftar.menghasilkan
sumber
APL (Dyalog Extended) , 22 byte
Cobalah online!
Port jawaban GolfScript.
sumber
C, 164 byte
Dibawa dalam serangkaian byte hex dan dikonversi ke aliran biner manchester.
Uji:
Keluaran:
Generator data uji 16kb:
test_data.c:
1.6G i5dual uji waktu inti:
sumber
PHP, 156 byte
Diberikan input
[0, 1, 2, 3, 4, 5]
, ia mengembalikan:Ini mengkodekan 16 KiB data dalam 0,015 detik dan 1 MiB data dalam waktu sekitar 0,9 detik.
Kode ungolfed, implementasi lain (lebih lama dan sekitar dua kali lebih lambat) dan kasus uji dapat ditemukan di halaman solusi kode-golf saya di Github.
sumber