La codificación Manchester es un protocolo de telecomunicaciones utilizado en las comunicaciones de radio que garantiza las transiciones de bits a intervalos regulares para que un receptor pueda recuperar la frecuencia de reloj de los datos en sí. Duplica la tasa de bits, pero es barata y fácil de implementar. Es ampliamente utilizado por los operadores de radioaficionados.
El concepto es muy simple: a nivel de hardware, el reloj y las líneas de datos simplemente se combinan en XOR. En el software, esto se representa como la conversión de un flujo de bits de entrada en un flujo de salida de doble velocidad, con cada entrada '1' traducida a '01' y cada entrada '0' traducida a '10'.
Este es un problema fácil, pero está abierto a muchas implementaciones debido a su naturaleza de flujo de bits. Es decir, la codificación es conceptualmente un proceso bit a bit en lugar de un proceso byte a byte. Entonces, todos estamos de acuerdo en la endianidad, los bits menos significativos de la entrada se convierten en el byte menos significativo de la salida.
¡Tiempo de golf! Escriba una función que, dada una matriz arbitraria de bytes de longitud, devuelva una matriz de esos datos codificados por Manchester.
La entrada y la salida deben considerarse little-endian, el byte menos significativo primero y el BIT menos significativo primero en el flujo de bits.
Dibujo de flujo de bits 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
Ejemplos :
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]
reglas :
- La solución solo requiere un algoritmo para convertir la entrada en salida.
- La adquisición de entrada y salida de impresión NO son una parte necesaria de la solución, pero pueden incluirse. Le recomendamos que proporcione su código de prueba / impresión si no está incluido en su solución.
- La entrada es una matriz de bytes de 8 bits (lo que sea que eso signifique en el idioma que elija), NO una cadena de texto. Puede usar cadenas como formato de almacenamiento si es conveniente en su idioma, pero se deben admitir caracteres no imprimibles (es decir, 0xFF). La entrada también puede tomar una longitud si es necesario.
La memoria para la salida debe ser asignada por su rutina, no proporcionada.editar: requisito innecesario- La salida también es una matriz de bytes de 8 bits, y una longitud si es necesario.
- Debe admitir al menos 16 KB de entrada
- El rendimiento no debe ser demasiado horrible: <10 segundos por 16 KB
- Byte menos significativo primero en la memoria.
Desafío de canal lateral :
- ¡Desafíe la respuesta de otro usuario demostrando que su código es más rápido, más eficiente en memoria o produce un binario más pequeño!