Ilość zmiennej długości (określany również jako VLQ lub uintvar
) to sposób kodowania do 28-bitowej wartości całkowitej z wykorzystaniem tylko tylu bajtów w razie potrzeby. Zostało to wykorzystane w formacie pliku MIDI jako sposób na zminimalizowanie rozmiaru niektórych danych zdarzeń.
Sposób działania jest dość prosty. Jako seria bajtów big-endian, najbardziej znaczącym bitem (MSB) każdego bajtu jest znak 1
wskazujący, że następuje kolejny bajt VLQ. Pozostałe 7 bitów każdego bajtu stanowi zdekodowaną wartość.
Przykład (z Wikipedii):
[ 0x86, 0xc3, 0x17 ] => 106903
Dodatkowe informacje: Wikipedia , Some Guy .
Wyzwanie:
Biorąc pod uwagę ilość o zmiennej długości, przekonwertuj ją na wartość całkowitą.
Wejście:
Lista od jednego do czterech bajtów lub 32-bitowy typ wartości reprezentujący prawidłową wartość VLQ liczby całkowitej.
Wynik:
Wartość całkowita wejścia VLQ.
Zasady i punktacja:
- To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach dla każdego języka .
- Obowiązują standardowe reguły i domyślne reguły we / wy .
- Luki zabronione (oczywiście).
- Podaj link z testem swojego kodu ( TIO.run itp.).
- Zalecane jest jasne wyjaśnienie Twojej odpowiedzi.
- Wbudowane, które obsługują tę konwersję, nie są zbanowane, jednak nieużywanie ich jest o wiele bardziej interesujące.
Przypadki testowe:
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
Uwaga: nie musisz używać literałów szesnastkowych do reprezentowania bajtu jako danych wejściowych lub wyjściowych. Możesz użyć dziesiętnej literału ( [ 129, 128, 0 ]
), liczby całkowitej ( 0x80818000
) lub innej rozsądnej reprezentacji bajtów / oktetów, jeśli lepiej pasuje do Twojej platformy. Format jest elastyczny, o ile reprezentuje 1-4 bajty / oktety.
Golf daleko!
[0x01, 0x80, 0x02] => 1
?