Una cantidad de longitud variable (también conocida como VLQ o uintvar
) es una forma de codificar un valor entero de hasta 28 bits utilizando solo tantos bytes como sea necesario. Esto se usó en formato de archivo MIDI como una forma de minimizar el tamaño de ciertos datos de eventos.
La forma en que funciona es bastante simple. Como una serie de bytes big-endian, el bit más significativo (MSB) de cada byte es un 1
para indicar que sigue otro byte VLQ. Los 7 bits restantes de cada byte forman el valor decodificado.
Ejemplo (de Wikipedia):
[ 0x86, 0xc3, 0x17 ] => 106903
Referencias adicionales: Wikipedia , Some Guy .
Desafío:
Dada una cantidad de longitud variable, conviértala a su valor entero.
Entrada:
Una lista de uno a cuatro bytes o un tipo de valor de 32 bits que representa un VLQ válido de un entero.
Salida:
El valor entero de la entrada VLQ.
Reglas y puntuación:
- Este es el código de golf, por lo que gana la respuesta más corta en bytes para cada idioma .
- Se aplican las reglas estándar y las reglas de E / S predeterminadas .
- Lagunas prohibidas (por supuesto).
- Proporcione un enlace con una prueba para su código ( TIO.run , etc.).
- Se recomienda encarecidamente una explicación clara de su respuesta.
- Los elementos integrados que manejan esta conversión no están prohibidos, sin embargo, no usarlos es mucho más interesante.
Casos de prueba:
Input (VLQ) Output (int)
[ 0x00 ] => 0
[ 0x07 ] => 7
[ 0x7f ] => 127
[ 0x81, 0x00 ] => 128
[ 0xC0, 0x00 ] => 8192
[ 0xff, 0x7f ] => 16383
[ 0x81, 0x80, 0x00 ] => 16384
[ 0x86, 0xc3, 0x17 ] => 106903
[ 0xbd, 0x84, 0x40 ] => 1000000
[ 0xff, 0xff, 0x7f ] => 2097151
[ 0xC0, 0x80, 0x80, 0x00 ] => 134217728
[ 0xFF, 0xFF, 0xFF, 0x7F ] => 268435455
Nota: no es necesario que use literales hexadecimales para representar un byte como entrada o salida. Puede usar decimal literal ( [ 129, 128, 0 ]
), entero ( 0x80818000
) o cualquier otra representación razonable de byte / octeto si se adapta mejor a su plataforma. El formato es flexible siempre que represente 1-4 bytes / octetos.
¡Golf lejos!
[0x01, 0x80, 0x02] => 1
?