Una quantità a lunghezza variabile (nota anche come VLQ o uintvar
) è un modo per codificare fino a un valore intero a 28 bit utilizzando solo il numero di byte necessario. Questo è stato usato nel formato di file MIDI come un modo per ridurre al minimo le dimensioni di alcuni dati di eventi.
Il modo in cui funziona è abbastanza semplice. Come una serie di byte big-endian, il bit più significativo (MSB) di ciascun byte 1
indica che segue un altro byte VLQ. I restanti 7 bit di ciascun byte costituiscono il valore decodificato.
Esempio (da Wikipedia):
[ 0x86, 0xc3, 0x17 ] => 106903
Ulteriori riferimenti: Wikipedia , Some Guy .
Sfida:
Data una quantità di lunghezza variabile, convertila nel suo valore intero.
Ingresso:
Un elenco da uno a quattro byte o un tipo di valore a 32 bit che rappresenta un VLQ valido di un numero intero.
Produzione:
Il valore intero dell'ingresso VLQ.
Regole e punteggio:
- Questo è code-golf, quindi vince la risposta più breve in byte per ogni lingua .
- Si applicano le regole standard e le regole I / O predefinite .
- Scappatoie vietate (ovviamente).
- Fornisci un link con un test per il tuo codice ( TIO.run , ecc.).
- Si consiglia vivamente una spiegazione chiara della risposta.
- Gli incorporati che gestiscono questa conversione non sono vietati, tuttavia non usarli è molto più interessante.
Casi 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
Nota: non è necessario utilizzare valori letterali esadecimali per rappresentare un byte come input o output. È possibile utilizzare il valore decimale letterale ( [ 129, 128, 0 ]
), intero ( 0x80818000
) o qualsiasi altra rappresentazione byte / ottetto ragionevole se più adatto alla propria piattaforma. Il formato è flessibile purché rappresenti 1-4 byte / ottetti.
Golf lontano!
[0x01, 0x80, 0x02] => 1
?