Uma quantidade de tamanho variável (também chamada de VLQ ou uintvar
) é uma maneira de codificar um valor inteiro de 28 bits usando apenas o número de bytes necessário. Isso foi usado no formato de arquivo MIDI como uma maneira de minimizar o tamanho de determinados dados do evento.
O modo como funciona é bastante simples. Como uma série big-endian de bytes, o bit mais significativo (MSB) de cada byte é a 1
para indicar que outro byte VLQ segue. Os 7 bits restantes de cada byte compõem o valor decodificado.
Exemplo (da Wikipedia):
[ 0x86, 0xc3, 0x17 ] => 106903
Referências adicionais: Wikipedia , Some Guy .
Desafio:
Dada uma quantidade de comprimento variável, converta-a no seu valor inteiro.
Entrada:
Uma lista de um a quatro bytes ou um tipo de valor de 32 bits representando um VLQ válido de um número inteiro.
Resultado:
O valor inteiro da entrada VLQ.
Regras e pontuação:
- Isso é código-golfe, então a resposta mais curta em bytes para cada idioma vence.
- Regras padrão e regras de E / S padrão se aplicam.
- Lacunas proibidas (é claro).
- Forneça o link com um teste para o seu código ( TIO.run , etc).
- Uma explicação clara para sua resposta é altamente recomendada.
- Os built-ins que lidam com essa conversão não são banidos, mas não usá-los é muito mais interessante.
Casos de teste:
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: você não precisa usar literais hexadecimais para representar um byte como sua entrada ou saída. Você pode usar literal decimal ( [ 129, 128, 0 ]
), inteiro ( 0x80818000
) ou qualquer outra representação razoável de bytes / octetos, se for mais adequada à sua plataforma. O formato é flexível desde que represente 1 a 4 bytes / octetos.
Golf away!
[0x01, 0x80, 0x02] => 1
?