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!
fonte
[0x01, 0x80, 0x02] => 1
?Respostas:
APL (dzaima / APL) , 8 bytes
Experimente online!
Quão:
fonte
Pari / GP , 24 bytes
Experimente online!
fonte
Wolfram Language (Mathematica) , 25 bytes
Experimente online!
Wolfram Language (Mathematica) , 25 bytes
Experimente online!
fonte
J , 10 bytes
Experimente online!
Inspirando-se na resposta de J Salle no APL.
128|]
Restante dos números de entrada dividido por 128128#.
Interpretado como os dígitos de um número 128 basefonte
Gelatina , 6 bytes
Experimente online!
Equivalente à resposta Pari / GP de alephalpha .
fonte
05AB1E , 6 bytes
Experimente online!
128
fonte
7o
. Hoje em dia você pode compactar certos números inteiros de 3 bytes (intervalo[101,355]
) em 2 bytes, portanto, 128 podem serƵR
assim. Também me perguntei a mesma coisa sobre os 2 bytes incorporados para 16. Normalmente, você usaria o literal ou, caso contrário, teríamos4o
/4n
/8·
se um dígito estiver por trás dele no programa. Somente quando um dígito é antes do 16, que eu não acho que iria acontecer, o embutida é útil ..Stax , 8 bytes
Execute e depure
Algoritmo:
fonte
JavaScript (ES6), 29 bytes
-2 bytes graças a @Shaggy
Recebe a entrada como uma matriz de bytes.
Experimente online!
fonte
APL + WIN, 22 bytes
Solicita um vetor de números inteiros:
Experimente online! Cortesia de Dyalog Classic
Explicação:
fonte
Stax , 12 bytes
Execute e depure-o em staxlang.xyz!
Descompactado (14 bytes) e explicação:
O Stax possui conversão básica embutida, mas funciona apenas em strings. É quase funciona em listas de números inteiros, embora; o problema está no manuseio de Stax
0
.Uma string é uma lista de números inteiros. Quando você usa uma lista como essa, qualquer zero é automaticamente convertido em 32 como uma abreviação para espaços. Como o interno
|b
para conversão de base trata seu operando como uma cadeia de caracteres e não como uma lista bruta de números inteiros, qualquer caso com zero falhará.10 bytes, falha nos zeros
Execute e depure-o em staxlang.xyz!
fonte
{:B7)m$:b
chega a 8 e parece funcionar também, embora seja uma espécie de uso exótico$
.C (gcc) , 48 bytes
Pega um número inteiro na ordem big-endian como entrada, que é a mesma ordem que uma matriz de bytes.
Experimente online!
C (gcc) , 53 bytes
Se uma matriz de bytes for necessária:
Experimente online!
fonte
-O0
, o que permite (geralmente) armazenar um valor de retorno no primeiro parâmetro. Essa é uma característica peculiar do golfe de código, mas não funciona com níveis mais altos de otimização.&128
por>>7
.MathGolf , 14 bytes
Entrada como números inteiros.
Experimente online.
Tenho a sensação de que isso pode ser mais curto. É um pouco chato que o MathGolf tenha um byte incorporado para a constante
128
, mas sem conversão de base (exceto para binário / hexadecimal).Explicação:
fonte
Python 3 ,
5849 bytes-9 bytes graças a @Chas e @ ar4093
Experimente online!
ou
Experimente online!
Entrada via lista de números inteiros.
A
bin
função do Python adiciona "0b" ao início da string, para que sejam retiradas antes que possam ser concatenadas.Ele também não mantém zeros à esquerda, portanto, se não houver nenhum (também conhecido como último byte), eles deverão ser adicionados novamente. bem.Obrigado ao @Chas por descobrir que, sempre definindo o primeiro bit, posso remover os três primeiros caracteres e pronto.Aparentemente (de acordo com @ ar4093), a
format
função permite não apenas não ter o prefixo '0b', mas também remover o primeiro bit e preencher 7 caracteres, tudo ao mesmo tempo.fonte
bin(a|128)[3:]
, pois não precisará dozfill
.bin(a)[2:].zfill(8)[1:]
->f"{a%128:07b}"
PHP , 42 bytes
Experimente online! e verifique todos os casos de teste .
Entrada via linha de comando args, saída para
STDOUT
.fonte
Japonês ,
108 bytesRecebe a entrada como uma matriz de números inteiros.
Experimente ou execute todos os casos de teste (o cabeçalho nos dois converte do formato de entrada usado no desafio)
Economizou 2 bytes, inspirando-se na solução de alephalpha .
fonte
Carvão , 11 bytes
Experimente online! Link é a versão detalhada do código. Recebe entrada como uma matriz. Explicação:
fonte
Python 2 , 42 bytes
Experimente online!
fonte
Lote do Windows, 76 bytes
Passe parâmetros prefixados com "0x" e espaço entre (por exemplo, 0xC0 0x80 0x80 0x00).
fonte
@set y=,ax=
execução entre as execuções.