Величина переменной длины (также упоминается как VLQ или uintvar
) способ кодировать до 28 битное целое значение , используя только столько байт , сколько необходимо. Это использовалось в формате файла MIDI как способ минимизировать размер определенных данных события.
Как это работает, довольно просто. В качестве последовательности байтов с 1
прямым порядком байтов старший значащий бит (MSB) каждого байта представляет собой a, чтобы указать, что следует другой байт VLQ. Оставшиеся 7 бит каждого байта составляют декодированное значение.
Пример (из Википедии):
[ 0x86, 0xc3, 0x17 ] => 106903
Дополнительные ссылки: Википедия , Some Guy .
Вызов:
Если дано значение переменной длины, преобразуйте его в целочисленное значение.
Входные данные:
Список от одного до четырех байтов или 32-битный тип значения, представляющий действительный VLQ целого числа.
Выход:
Целочисленное значение входа VLQ.
Правила и оценки:
- Это код-гольф, поэтому выигрывает самый короткий ответ в байтах для каждого языка .
- Применяются стандартные правила и правила ввода / вывода по умолчанию .
- Лазейки запрещены (конечно).
- Пожалуйста, предоставьте ссылку с тестом для вашего кода ( TIO.run и т. Д.).
- Четкое объяснение вашего ответа настоятельно рекомендуется.
- Встроенные модули , которые обрабатывают это преобразование не запрещены, однако не их использования является намного более интересным.
Тестовые случаи:
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
Примечание. От вас не требуется использовать шестнадцатеричные литералы для представления байта в качестве входных или выходных данных. Вы можете использовать десятичное литерал ( [ 129, 128, 0 ]
), целое число ( 0x80818000
) или любое другое разумное представление байта / октета, если оно лучше подходит для вашей платформы. Формат гибкий, если он представляет 1-4 байта / октета.
Гольф прочь!
[0x01, 0x80, 0x02] => 1
?