A codificação Manchester é um protocolo de telecomunicações usado em radiocomunicação que garante a transição de bits em intervalos regulares, para que um receptor possa recuperar a taxa de clock dos próprios dados. Dobra a taxa de bits, mas é barato e simples de implementar. É amplamente utilizado por operadores de rádio amador.
O conceito é muito simples: no nível do hardware, o relógio e as linhas de dados são simplesmente combinadas com XOR. No software, isso é retratado como a conversão de um fluxo de bits de entrada em um fluxo de saída de taxa dupla, com cada entrada '1' traduzida para '01' e cada entrada '0' traduzida para '10'.
Esse é um problema fácil, mas aberto a muitas implementações devido à sua natureza de fluxo de bits. Ou seja, a codificação é conceitualmente um processo bit a bit em vez de um processo byte a byte. Portanto, todos concordamos em endianness, os bits menos significativos da entrada se tornam o byte menos significativo da saída.
Tempo de golfe! Escreva uma função que, dada uma matriz arbitrária de bytes, retorne uma matriz desses dados codificados por manchester.
A entrada e a saída devem ser consideradas little-endian, menos bytes significativos primeiro e bits menos significativos primeiro no fluxo de bits.
Desenho de fluxo 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
Exemplos :
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]
Regras :
- A solução requer apenas algoritmo para converter entrada em saída.
- A aquisição de entrada e saída de impressão NÃO é uma parte necessária da solução, mas pode estar incluída. Você deve fornecer seu código de teste / impressão, se não estiver incluído na sua solução.
- A entrada é uma matriz de bytes de 8 bits (o que quer que isso possa significar no seu idioma preferido), NÃO uma sequência de texto. Você pode usar cadeias de caracteres como formato de armazenamento, se for conveniente no seu idioma, mas caracteres não imprimíveis (por exemplo, 0xFF) devem ser suportados. A entrada também pode demorar, se necessário.
A memória para saída deve ser alocada pela sua rotina, não fornecida.editar: requisito desnecessário- A saída também é uma matriz de bytes de 8 bits e um comprimento, se necessário.
- Deve suportar pelo menos 16 KB de entrada
- O desempenho não deve ser muito horrível: <10s para 16 KB
- Byte menos significativo primeiro na memória.
Desafio de canal lateral :
- Desafie a resposta de outro usuário, provando que seu código é mais rápido, mais eficiente em memória ou produz um binário menor!