Detección de errores, parte 2: el codificador de Hamming
Este desafío es una continuación de Detección de errores, parte 1: el comprobador de Hamming . Para recapitular:
- Cada bit redundante de un bloque de Hamming informa sobre la paridad de la cantidad de
1s que hay dentro de su región: un0indica una cantidad par de1s y un1indica una cantidad impar de1s. - Los bits redundantes siempre se colocan en potencias de dos: índice
1,2,4, etc., o en binario1,10,100, etc. - Todos los índices dentro de una región están relacionados con el índice del bit redundante de esa región: para el bit redundante en la posición
0100(decimal4), los índices de su región son0101,0110,0111,1100,1101,1110y1111. Específicamente, todos tienen un1en el tercer dígito empezando por la derecha. Este patrón se aplica a todas las regiones:
- Un bloque con m bits necesita n bits redundantes, donde 2^n = m.
En este desafío, tu tarea es escribir una función que tome un bloque de Hamming y complete todos los bits redundantes con el valor apropiado. Los bits redundantes ya están colocados, pero todos son 0.
Esta vez, se utilizará el bit con índice 0. Este bit codificará información sobre todo el bloque y tomará el valor (0 o 1) que haga que la cantidad total de 1s sea par. Usar este bit adicional permite que el receptor detecte si se han producido dos errores, aunque no sus posiciones.
Tu código debe funcionar con bloques de distintos tamaños (los tamaños siempre serán potencias de dos).
Ejemplos
hamming_coder("0000010100011000") ➞ "0100110100011000"
hamming_coder("0000000001010000") ➞ "1010000001010000"
hamming_coder("00010111010110000111001110001010") ➞ "00110111010110000111001110001010"
hamming_coder("00000110001001000111010100100101") ➞ "10101110101001000111010100100101"Notas
- Los bits redundantes siempre tienen potencias de dos como índices.
- Cada región divide el bloque en dos. Algunas regiones dividen el bloque verticalmente, con columnas que duplican su ancho; otras lo dividen horizontalmente, con filas que duplican su altura. Los bits redundantes siempre se ubican en la esquina superior izquierda de cada región. Aquí hay un ejemplo de cómo se dividiría un bloque de tamaño 32.