La codifica Manchester è un protocollo di telecomunicazione utilizzato nelle comunicazioni radio che garantisce transizioni di bit a intervalli regolari in modo che un ricevitore possa recuperare la frequenza di clock dai dati stessi. Raddoppia il bitrate, ma è economico e semplice da implementare. È ampiamente utilizzato dagli operatori radioamatori.
Il concetto è molto semplice: a livello hardware, l'orologio e le linee dati sono semplicemente XORed insieme. Nel software, questo è rappresentato come la conversione di un flusso di input di bit in un flusso di output a doppia velocità, con ogni input '1' tradotto in '01' e ogni input '0' tradotto in '10'.
Questo è un problema facile, ma aperto a molte implementazioni a causa della sua natura bitstream. Cioè, la codifica è concettualmente un processo bit per bit anziché un processo byte per byte. Quindi siamo tutti d'accordo sull'endianness, i bit meno significativi dell'ingresso diventano il byte meno significativo dell'uscita.
Tempo di golf! Scrivere una funzione che, dato un array di byte di lunghezza arbitraria, restituisca un array di quei dati codificati manchester.
L'input e l'output devono essere considerati prima little-endian, byte meno significativi e BIT meno significativi per primi nel flusso di bit.
Disegno 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
Esempi :
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]
Regole :
- La soluzione richiede solo un algoritmo per convertire l'input in output.
- L'acquisizione dell'input e la stampa dell'output NON sono una parte richiesta della soluzione, ma possono essere inclusi. Sei incoraggiato a fornire il tuo codice di prova / stampa se non incluso nella tua soluzione.
- L'input è un array di byte a 8 bit (qualunque cosa ciò possa significare nella tua lingua preferita), NON una stringa di testo. È possibile utilizzare le stringhe come formato di archiviazione, se conveniente nella propria lingua, ma devono essere supportati caratteri non stampabili (ovvero 0xFF). L'input può anche richiedere una lunghezza, se necessario.
La memoria per l'output deve essere allocata dalla routine, non fornita.modifica: requisito non necessario- L'output è anche un array di byte a 8 bit e, se necessario, una lunghezza.
- Deve supportare almeno 16 KB di input
- Le prestazioni non devono essere troppo orribili: <10s per 16 KB
- Il byte meno significativo per primo in memoria.
Sfida del canale laterale :
- Sfida la risposta di un altro utente dimostrando che il tuo codice è più veloce, più efficiente in termini di memoria o produce un file binario più piccolo!