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!
źródło
[0x01, 0x80, 0x02] => 1
?Odpowiedzi:
APL (dzaima / APL) , 8 bajtów
Wypróbuj online!
W jaki sposób:
źródło
Pari / GP , 24 bajty
Wypróbuj online!
źródło
Wolfram Language (Mathematica) , 25 bajtów
Wypróbuj online!
Wolfram Language (Mathematica) , 25 bajtów
Wypróbuj online!
źródło
J , 10 bajtów
Wypróbuj online!
Czerpiąc inspirację z odpowiedzi APL J Salle'a.
128|]
Reszta liczb wejściowych podzielona przez 128128#.
Interpretowane jako cyfry numeru podstawowego 128źródło
Galaretka , 6 bajtów
Wypróbuj online!
Odpowiednik odpowiedzi Pari / GP Alephalpha .
źródło
05AB1E , 6 bajtów
Wypróbuj online!
128
źródło
7o
. W dzisiejszych czasach możesz skompresować pewne 3-bajtowe liczby całkowite (zakres[101,355]
) w 2 bajtach, więc 128 może byćƵR
tak czy inaczej .. Zastanawiałem się również nad tym 2-bajtowym wbudowanym dla 16-u. Zazwyczaj używasz literału , w przeciwnym razie mielibyśmy4o
/4n
/8·
jeśli cyfra stoi za nim w programie. Tylko wtedy, gdy cyfra jest przed 16, co nie wydaje mi się, by się stało, wbudowane jest przydatne ..Stax , 8 bajtów
Uruchom i debuguj
Algorytm:
źródło
JavaScript (ES6), 29 bajtów
-2 bajty dzięki @Shaggy
Pobiera dane wejściowe jako tablicę bajtów.
Wypróbuj online!
źródło
APL + WIN, 22 bajty
Monituje o wektor liczb całkowitych:
Wypróbuj online! Dzięki uprzejmości Dyalog Classic
Wyjaśnienie:
źródło
Stax , 12 bajtów
Uruchom i debuguj na staxlang.xyz!
Rozpakowane (14 bajtów) i objaśnienie:
Stax ma wbudowaną konwersję bazy, ale działa tylko na łańcuchach. To prawie działa na listach liczb całkowitych, chociaż; problem tkwi w obsłudze Staxa
0
.Ciąg jest listą liczb całkowitych. Gdy używasz takiej listy jako łańcucha, wszelkie zera są automatycznie konwertowane na 32 jako ładny skrót do spacji. Od czasu wbudowania
|b
do konwersji bazowej traktuje swój argument jako ciąg, a nie jako surową listę liczb całkowitych, każdy przypadek z zerem zakończy się niepowodzeniem.10 bajtów, zero na zerach
Uruchom i debuguj na staxlang.xyz!
źródło
{:B7)m$:b
spakuje do 8 i wydaje się również działać, chociaż jest to swego rodzaju egzotyczne zastosowanie$
.C (gcc) , 48 bajtów
Pobiera na wejściu liczbę całkowitą w kolejności big-endian, która jest taka sama jak tablica bajtów.
Wypróbuj online!
C (gcc) , 53 bajty
Jeśli potrzebna jest tablica bajtów:
Wypróbuj online!
źródło
-O0
, która pozwala (zwykle) przechowywać wartość zwracaną w pierwszym parametrze. To dziwactwo ^ Wfeature w golfie kodu, ale nie działa z wyższymi poziomami optymalizacji.&128
go>>7
.MathGolf , 14 bajtów
Wprowadź jako liczby całkowite.
Wypróbuj online.
Mam wrażenie, że może być krótszy. To trochę denerwujące, że MathGolf ma wbudowaną 1-bajtową funkcję stałej
128
, ale nie ma konwersji podstawowej (z wyjątkiem binarnej / szesnastkowej).Wyjaśnienie:
źródło
Python 3 ,
5849 bajtów-9 bajtów dzięki @Chas i @ ar4093
Wypróbuj online!
lub
Wypróbuj online!
Wprowadzanie za pomocą listy liczb całkowitych.
bin
Funkcja Pythona dodaje „0b” na początku łańcucha, więc należy je zdjąć, zanim można je połączyć.Nie zachowuje również zer wiodących, więc jeśli nie ma żadnych (czyli ostatniego bajtu), należy je dodać z powrotem. A jeśli istnieje wiodący (czyli wszystkie oprócz ostatniego bajtu), który należy usunąć jako dobrze.Dzięki @Chas za ustalenie, że zawsze ustawiając pierwszy bit, mogę po prostu usunąć pierwsze trzy znaki i gotowe.Najwyraźniej (według @ ar4093)
format
funkcja pozwala nie tylko nie mieć przedrostka „0b”, ale także usunąć pierwszy bit i dopełnienie do 7 znaków jednocześnie.źródło
bin(a|128)[3:]
ponieważ nie potrzebujeszzfill
.bin(a)[2:].zfill(8)[1:]
->f"{a%128:07b}"
PHP , 42 bajty
Wypróbuj online! i zweryfikuj wszystkie przypadki testowe .
Wejście za pomocą argumentów wiersza poleceń, wyjście do
STDOUT
.źródło
Japt ,
108 bajtówPobiera dane wejściowe jako tablicę liczb całkowitych.
Spróbuj lub uruchom wszystkie przypadki testowe (nagłówek w obu konwertuje z formatu wejściowego używanego w wyzwaniu)
Zaoszczędzono 2 bajty, czerpiąc inspirację z rozwiązania alephalpha .
źródło
Węgiel drzewny , 11 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Pobiera dane wejściowe jako tablicę. Wyjaśnienie:
źródło
Python 2 , 42 bajty
Wypróbuj online!
źródło
Pakiet Windows, 76 bajtów
Przekaż parametry z prefiksem „0x” i spacją między (np. 0xC0 0x80 0x80 0x00).
źródło
@set y=,ax=
.