Величина переменной длины (также упоминается как 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
?Ответы:
APL (dzaima / APL) , 8 байт
Попробуйте онлайн!
Как:
источник
Pari / GP , 24 байта
Попробуйте онлайн!
источник
Wolfram Language (Mathematica) , 25 байтов
Попробуйте онлайн!
Wolfram Language (Mathematica) , 25 байтов
Попробуйте онлайн!
источник
J , 10 байт
Попробуйте онлайн!
Вдохновленный ответом APL J Salle.
128|]
Остаток входных чисел, разделенных на 128128#.
Интерпретируется как цифры базового 128 числаисточник
Желе , 6 байт
Попробуйте онлайн!
Эквивалентно ответу Pari / GP алефальфы .
источник
05AB1E , 6 байтов
Попробуйте онлайн!
128
источник
7o
. В настоящее время вы можете сжать некоторые 3-байтовые целые числа (диапазон[101,355]
) в 2 байта, так что 128 может быть вƵR
любом случае ... Я также удивляюсь тому же, что встроенная 2-байтовая функция для 16 ... Обычно вы просто используете литерал , или в противном случае мы бы4o
/4n
/8·
если цифра за ней в программе. Только когда цифра перед 16, что, я думаю, не произойдет, встроеннаяStax , 8 байт
Запустите и отладьте его
Алгоритм:
источник
JavaScript (ES6), 29 байт
-2 байта благодаря @Shaggy
Принимает ввод в виде массива байтов.
Попробуйте онлайн!
источник
APL + WIN, 22 байта
Запрашивает вектор целых чисел:
Попробуйте онлайн! Предоставлено Dyalog Classic
Объяснение:
источник
Stax , 12 байт
Запустите и отладьте его на staxlang.xyz!
Распаковывается (14 байт) и объяснение:
Stax имеет встроенное базовое преобразование, но работает только со строками. Это почти работает со списками целых чисел, хотя; проблема в обработке Stax's
0
.Строка - это список целых чисел. Когда вы используете такой список в виде строки, любые нули автоматически преобразуются в 32, что является хорошим сокращением пробелов. Поскольку встроенное
|b
преобразование для базы обрабатывает свой операнд как строку, а не как необработанный список целых чисел, любой случай с нулем завершится неудачей.10 байт, обнуляется
Запустите и отладьте его на staxlang.xyz!
источник
{:B7)m$:b
Пакет до 8, и, кажется, работает, хотя это своего рода экзотическое использование$
.C (gcc) , 48 байтов
Принимает в качестве входных данных целое число в порядке с прямым порядком байтов, которое соответствует порядку байтового массива.
Попробуйте онлайн!
C (gcc) , 53 байта
Если требуется байтовый массив:
Попробуйте онлайн!
источник
-O0
, что позволяет (обычно) сохранять возвращаемое значение в первом параметре. Это странная штука в игре в гольф, но она не работает с более высокими уровнями оптимизации.&128
на>>7
.MathGolf , 14 байтов
Введите как целые числа.
Попробуйте онлайн.
У меня такое ощущение, что это может быть короче. Немного раздражает, что MathGolf имеет встроенную 1-байтовую константу
128
, но без преобразования базы (кроме двоичного / шестнадцатеричного).Объяснение:
источник
Python 3 ,
5849 байт-9 байт благодаря @Chas и @ ar4093
Попробуйте онлайн!
или
Попробуйте онлайн!
Ввод через список целых чисел.
bin
Функция Python добавляет «0b» в начало строки, поэтому их необходимо удалить, прежде чем их можно будет объединить.Кроме того, он не сохраняет начальные нули, поэтому, если их нет (так называемый последний байт), они должны быть добавлены обратно. И если есть ведущий (он же все, кроме последнего байта), который должен быть удален как Что ж.Спасибо @Chas за то, что мы выяснили, что всегда устанавливая первый бит, я могу просто удалить первые три символа и все готово.Очевидно (согласно @ ar4093)
format
функция позволяет не только не иметь префикс '0b', но также удалять первый бит и заполнять до 7 символов одновременно.источник
bin(a|128)[3:]
как тогда вам не нужноzfill
.bin(a)[2:].zfill(8)[1:]
->f"{a%128:07b}"
PHP , 42 байта
Попробуйте онлайн! и проверьте все контрольные примеры .
Ввод через аргументы командной строки, вывод в
STDOUT
.источник
Japt ,
108 байтПринимает ввод как массив целых чисел.
Попробуйте или запустите все тесты (заголовок в обоих конвертируется из входного формата, используемого в вызове)
Сохранение 2 байтов путем вдохновения из раствора алефальфа .
источник
Древесный уголь , 11 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Принимает ввод в виде массива. Объяснение:
источник
Python 2 , 42 байта
Попробуйте онлайн!
источник
Пакет Windows, 76 байт
Передайте параметры с префиксом «0x» и пробел между ними (например, 0xC0 0x80 0x80 0x00).
источник
@set y=,ax=
промежуточный прогон.