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!
la source
[0x01, 0x80, 0x02] => 1
?Réponses:
APL (dzaima / APL) , 8 octets
Essayez-le en ligne!
Comment:
la source
Pari / GP , 24 octets
Essayez-le en ligne!
la source
Wolfram Language (Mathematica) , 25 octets
Essayez-le en ligne!
Wolfram Language (Mathematica) , 25 octets
Essayez-le en ligne!
la source
J , 10 octets
Essayez-le en ligne!
Inspiré de la réponse APL de J Salle.
128|]
Reste des nombres entrants divisé par 128128#.
Interprété comme les chiffres d'un nombre de base 128la source
Gelée , 6 octets
Essayez-le en ligne!
Équivalent à la réponse Pari / GP d' alephalpha .
la source
05AB1E , 6 octets
Essayez-le en ligne!
128
la source
7o
. De nos jours, vous pouvez compresser certains entiers de 3 octets (plage[101,355]
) en 2 octets, donc 128 peut être deƵR
toute façon .. Je me suis également demandé la même chose à propos de la fonction intégrée de 2 octets pour 16 .. Habituellement, vous utiliseriez simplement le littéral , ou sinon nous aurions4o
/4n
/8·
si un chiffre est derrière dans le programme. Ce n'est que lorsqu'un chiffre est avant le 16, ce qui ne devrait pas arriver, que la fonction intégrée est utile ..Stax , 8 octets
Exécuter et déboguer
Algorithme:
la source
JavaScript (ES6), 29 octets
-2 octets grâce à @Shaggy
Prend l'entrée comme un tableau d'octets.
Essayez-le en ligne!
la source
APL + WIN, 22 octets
Demande un vecteur d'entiers:
Essayez-le en ligne! Gracieuseté de Dyalog Classic
Explication:
la source
Stax , 12 octets
Exécutez-le et déboguez-le sur staxlang.xyz!
Déballé (14 octets) et explication:
Stax a une conversion de base intégrée, mais il ne fonctionne que sur les chaînes. Il presque fonctionne sur les listes d'entiers, bien que; le problème est dans la gestion de Stax de
0
.Une chaîne est une liste d'entiers. Lorsque vous utilisez une telle liste en tant que chaîne, tous les zéros sont automatiquement convertis en 32 en tant que raccourci pour les espaces. Étant donné que le code intégré
|b
pour la conversion de base traite son opérande comme une chaîne plutôt que comme une liste brute d'entiers, tout cas avec un zéro échouera.10 octets, échoue sur les zéros
Exécutez-le et déboguez-le sur staxlang.xyz!
la source
{:B7)m$:b
packs à 8, et semble fonctionner aussi, bien que ce soit une utilisation exotique de$
.C (gcc) , 48 octets
Prend un entier dans l'ordre big-endian en entrée, qui est le même ordre qu'un tableau d'octets.
Essayez-le en ligne!
C (gcc) , 53 octets
Si un tableau d'octets est nécessaire:
Essayez-le en ligne!
la source
-O0
, ce qui vous permet de stocker (généralement) une valeur de retour dans le premier paramètre. C'est une particularité dans le golf de code, mais ne fonctionne pas avec des niveaux d'optimisation plus élevés.&128
par>>7
.MathGolf , 14 octets
Entrez sous forme d'entiers.
Essayez-le en ligne.
J'ai le sentiment que cela peut être plus court. C'est un peu ennuyeux que MathGolf ait un intégré de 1 octet pour la constante
128
, mais pas de conversion de base (sauf pour binaire / hexadécimal).Explication:
la source
Python 3 ,
5849 octets-9 octets grâce à @Chas et @ ar4093
Essayez-le en ligne!
ou
Essayez-le en ligne!
Entrée via une liste d'entiers.
La
bin
fonction de Python ajoute "0b" au début de la chaîne, donc ceux-ci doivent être supprimés avant de pouvoir être concaténés.Il ne conserve pas non plus les zéros non significatifs, donc s'il n'y en a pas (alias le dernier octet) ceux-ci doivent être rajoutés. Et s'il y en a un (alias tous sauf le dernier octet) qui doit être supprimé comme bien.Merci à @Chas d'avoir compris qu'en définissant toujours le premier bit, je peux simplement supprimer les trois premiers caractères et terminer.Apparemment (selon @ ar4093), la
format
fonction permet non seulement de ne pas avoir le préfixe '0b', mais aussi de supprimer le premier bit et le remplissage à 7 caractères en même temps.la source
bin(a|128)[3:]
car vous n'avez alors pas besoin dezfill
.bin(a)[2:].zfill(8)[1:]
->f"{a%128:07b}"
PHP , 42 octets
Essayez-le en ligne! et vérifier tous les cas de test .
Entrée via les arguments de la ligne de commande, sortie vers
STDOUT
.la source
Japt ,
108 octetsPrend l'entrée comme un tableau d'entiers.
Essayez-le ou exécutez tous les cas de test (l'en-tête dans les deux convertis à partir du format d'entrée utilisé dans le défi)
Enregistré 2 octets en s'inspirant de la solution d' alephalpha .
la source
Fusain , 11 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Prend l'entrée comme un tableau. Explication:
la source
Python 2 , 42 octets
Essayez-le en ligne!
la source
Windows Batch, 76 octets
Passez les paramètres préfixés avec "0x" et l'espace entre (par exemple 0xC0 0x80 0x80 0x00).
la source
@set y=,ax=
entre deux exécutions.