Implementa la codificación y decodificación de cantidades de longitud variable.
El objetivo de este ejercicio es implementar la codificación y decodificación VLQ.
En resumen, el propósito de esta codificación es codificar valores enteros de forma que se ahorren bytes. Solo los primeros 7 bits de cada byte son significativos (justificados a la derecha; algo así como un byte ASCII). Así que, si tienes un valor de 32 bits, tienes que desempaquetarlo en una serie de bytes de 7 bits. Por supuesto, tendrás un número variable de bytes en función de tu entero. Para indicar cuál es el último byte de la serie, dejas el bit n.º 7 a 0. En todos los bytes anteriores, pones el bit n.º 7 a 1.
Así que, si un entero está entre 0-127, se puede representar con un solo byte.
Aunque VLQ puede trabajar con números de tamaños arbitrarios, en este ejercicio nos limitaremos a números que quepan en un entero sin signo de 32 bits.
Aquí tienes ejemplos de enteros como valores de 32 bits y las cantidades de longitud variable a las que se traducen:
NUMBER VARIABLE QUANTITY
00000000 00
00000040 40
0000007F 7F
00000080 81 00
00002000 C0 00
00003FFF FF 7F
00004000 81 80 00
00100000 C0 80 00
001FFFFF FF FF 7F
00200000 81 80 80 00
08000000 C0 80 80 00
0FFFFFFF FF FF FF 7F
A veces es necesario lanzar una excepción. Cuando lo hagas, siempre debes incluir un mensaje de error significativo que indique cuál es el origen del error. Esto hace que tu código sea más legible y ayuda muchísimo con la depuración. En situaciones en las que sabes que el origen del error será de un tipo concreto, puedes optar por lanzar uno de los tipos de error integrados, pero aun así debes incluir un mensaje significativo.
Este ejercicio en concreto requiere que uses la instrucción raise para «lanzar» un ValueError si la secuencia que hay que descodificar o codificar está incompleta. Las pruebas solo pasarán si usas raise para lanzar la exception e incluyes un mensaje con ella.
Para lanzar un ValueError con un mensaje, escribe el mensaje como argumento del tipo exception:
# if the sequence is incomplete
raise ValueError("incomplete sequence")
Regístrate en Exercism para aprender y dominar Python con 17 conceptos146 ejercicios y mentoría humana real, todo gratis.