Une quantité de longueur variable (également appelée VLQ ou uintvar
) est un moyen de coder jusqu'à une valeur entière de 28 bits en utilisant uniquement autant d'octets que nécessaire. Cela a été utilisé au format de fichier MIDI comme un moyen de minimiser la taille de certaines données d'événements.
La façon dont cela fonctionne est assez simple. En tant que série d'octets big-endian, le bit le plus significatif (MSB) de chaque octet est un 1
pour indiquer qu'un autre octet VLQ suit. Les 7 bits restants de chaque octet constituent la valeur décodée.
Exemple (de Wikipedia):
[ 0x86, 0xc3, 0x17 ] => 106903
Références supplémentaires: Wikipedia , Some Guy .
Défi:
Étant donné une quantité de longueur variable, convertissez-la en sa valeur entière.
Contribution:
Une liste d'un à quatre octets ou un type de valeur 32 bits représentant un VLQ valide d'un entier.
Production:
La valeur entière de l'entrée VLQ.
Règles et notation:
- Il s'agit de code-golf, donc la réponse la plus courte en octets pour chaque langue gagne.
- Les règles standard et les règles d' E / S par défaut s'appliquent.
- Échappatoires interdites (bien sûr).
- Veuillez fournir un lien avec un test pour votre code ( TIO.run , etc.).
- Une explication claire de votre réponse est fortement recommandée.
- Encastrements qui gèrent cette conversion ne sont pas interdits, mais pas les utiliser est beaucoup plus intéressant.
Cas de test:
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
Remarque: vous n'êtes pas obligé d'utiliser des littéraux hexadécimaux pour représenter un octet comme entrée ou sortie. Vous pouvez utiliser littéral décimal ( [ 129, 128, 0 ]
), entier ( 0x80818000
) ou toute autre représentation d'octet / octet raisonnable si elle est mieux adaptée à votre plate-forme. Le format est flexible tant qu'il représente 1 à 4 octets / octets.
Golf loin!
[0x01, 0x80, 0x02] => 1
?