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!
fuente
[0x01, 0x80, 0x02] => 1
?Respuestas:
APL (dzaima / APL) , 8 bytes
Pruébalo en línea!
Cómo:
fuente
Pari / GP , 24 bytes
Pruébalo en línea!
fuente
Wolfram Language (Mathematica) , 25 bytes
Pruébalo en línea!
Wolfram Language (Mathematica) , 25 bytes
Pruébalo en línea!
fuente
J , 10 bytes
Pruébalo en línea!
Tomando inspiración de la respuesta APL de J Salle.
128|]
El resto de los números de entrada divididos por 128128#.
Interpretado como los dígitos de un número base 128fuente
Jalea , 6 bytes
Pruébalo en línea!
Equivalente a la respuesta de Alephalpha Pari / GP .
fuente
05AB1E , 6 bytes
Pruébalo en línea!
128
fuente
7o
. Hoy en día puedes comprimir ciertos números enteros de 3 bytes (rango[101,355]
) en 2 bytes, así que 128 puede ser deƵR
todos modos ... También me he preguntado lo mismo acerca de la construcción de 2 bytes para 16 ... Por lo general, solo usarías el literal , o de lo contrario tendríamos4o
/4n
/8·
si un dígito está detrás de él en el programa. Solo cuando un dígito es anterior al 16, lo que no creo que suceda, el builtin es útil ...Stax , 8 bytes
Ejecutar y depurarlo
Algoritmo:
fuente
JavaScript (ES6), 29 bytes
-2 bytes gracias a @Shaggy
Toma la entrada como una matriz de bytes.
Pruébalo en línea!
fuente
APL + WIN, 22 bytes
Solicita un vector de enteros:
Pruébalo en línea! Cortesía de Dyalog Classic.
Explicación:
fuente
Stax , 12 bytes
¡Ejecútelo y depúrelo en staxlang.xyz!
Desempaquetado (14 bytes) y explicación:
Stax tiene una conversión de base integrada, pero solo funciona en cadenas. Sin embargo, casi funciona en listas de enteros; El problema está en el manejo de Stax de
0
.Una cadena es una lista de enteros. Cuando usa una lista como una cadena, los ceros se convierten automáticamente a 32 como una forma abreviada de espacios. Dado que la
|b
conversión integrada para la base trata su operando como una cadena en lugar de como una lista sin formato de enteros, cualquier caso con un cero fallará.10 bytes, falla en ceros
¡Ejecútelo y depúrelo en staxlang.xyz!
fuente
{:B7)m$:b
paquetes a 8, y parece funcionar también, aunque es una especie de uso exótico de$
.C (gcc) , 48 bytes
Toma un entero en orden big-endian como entrada, que es el mismo orden que una matriz de bytes.
Pruébalo en línea!
C (gcc) , 53 bytes
Si se necesita una matriz de bytes:
Pruébalo en línea!
fuente
-O0
, lo que le permite (generalmente) almacenar un valor de retorno en el primer parámetro. Esta es una peculiaridad ^ Wfeature en golf de código, pero no funciona con niveles de optimización más altos.&128
con>>7
.MathGolf , 14 bytes
Entrada como enteros.
Pruébalo en línea.
Tengo la sensación de que esto puede ser más corto. Es un poco molesto que MathGolf tenga un byte incorporado de 1 byte para la constante
128
, pero no conversión de base (excepto para binario / hexadecimal).Explicación:
fuente
Python 3 ,
5849 bytes-9 bytes gracias a @Chas y @ ar4093
Pruébalo en línea!
o
Pruébalo en línea!
Entrada a través de la lista de enteros.
La
bin
función de Python agrega "0b" al comienzo de la cadena, por lo que deben eliminarse antes de que puedan concatenarse.Tampoco mantiene los ceros a la izquierda, por lo que si no hay ninguno (también conocido como el último byte), esos deben agregarse nuevamente. bien.Gracias a @Chas por descubrir que al configurar siempre el primer bit, puedo eliminar los primeros tres caracteres y listo.Aparentemente (según @ ar4093) la
format
función permite no solo no tener el prefijo '0b', sino también eliminar el primer bit y el relleno a 7 caracteres, todo al mismo tiempo.fuente
bin(a|128)[3:]
ya que no necesitazfill
.bin(a)[2:].zfill(8)[1:]
->f"{a%128:07b}"
PHP , 42 bytes
Pruébalo en línea! y verificar todos los casos de prueba .
Entrada a través de la línea de comando args, salida a
STDOUT
.fuente
Japt ,
108 bytesToma datos como una matriz de enteros.
Pruébalo o ejecuta todos los casos de prueba (encabezado en ambos conversos del formato de entrada utilizado en desafío)
Ahorró 2 bytes al inspirarse en la solución de alephalpha .
fuente
Carbón , 11 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Toma la entrada como una matriz. Explicación:
fuente
Python 2 , 42 bytes
Pruébalo en línea!
fuente
Lote de Windows, 76 bytes
Pase los parámetros con el prefijo "0x" y el espacio entre ellos (por ejemplo, 0xC0 0x80 0x80 0x00).
fuente
@set y=,ax=
recorrido entre ejecuciones.