Detección de errores, parte 2: el codificador de Hamming

Published by MyName in

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: un 0 indica una cantidad par de 1s y un 1 indica una cantidad impar de 1s.
  • Los bits redundantes siempre se colocan en potencias de dos: índice 1, 2, 4, etc., o en binario 1, 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 (decimal 4), los índices de su región son 0101, 0110, 0111, 1100, 1101, 1110 y 1111. Específicamente, todos tienen un 1 en el tercer dígito empezando por la derecha. Este patrón se aplica a todas las regiones: Índices en binario
  • 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.