Eine Variable-Länge-Menge (auch als VLQ oder bezeichnet uintvar
) ist eine Möglichkeit, mit nur so vielen Bytes wie nötig bis zu einem 28-Bit-Ganzzahlwert zu codieren. Dies wurde im MIDI-Dateiformat verwendet , um die Größe bestimmter Ereignisdaten zu minimieren.
Die Art und Weise, wie es funktioniert, ist ziemlich einfach. Als Big-Endian-Folge von Bytes gibt das höchstwertige Bit (MSB) jedes Bytes 1
an, dass ein weiteres VLQ-Byte folgt. Die verbleibenden 7 Bits jedes Bytes bilden den decodierten Wert.
Beispiel (aus Wikipedia):
[ 0x86, 0xc3, 0x17 ] => 106903
Zusätzliche Referenzen: Wikipedia , Some Guy .
Herausforderung:
Konvertieren Sie eine Menge variabler Länge in ihren ganzzahligen Wert.
Eingang:
Eine Liste mit ein bis vier Bytes oder einem 32-Bit-Wertetyp, der eine gültige VLQ einer Ganzzahl darstellt.
Ausgabe:
Der ganzzahlige Wert der VLQ-Eingabe.
Regeln und Wertung:
- Das ist Code-Golf, also gewinnt die kürzeste Antwort in Bytes für jede Sprache .
- Es gelten Standardregeln und Standard-E / A-Regeln .
- Lücken verboten (natürlich).
- Bitte geben Sie einen Link mit einem Test für Ihren Code an ( TIO.run usw.).
- Eine klare Erklärung für Ihre Antwort wird dringend empfohlen.
- Built-Ins, die diese Konvertierung handhaben, sind nicht gesperrt, aber es ist viel interessanter, sie nicht zu verwenden.
Testfälle:
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
Hinweis: Sie müssen keine Hex-Literale verwenden, um ein Byte als Eingabe oder Ausgabe darzustellen. Sie können dezimales Literal ( [ 129, 128, 0 ]
), Ganzzahl ( 0x80818000
) oder jede andere angemessene Byte- / Oktettdarstellung verwenden, wenn dies für Ihre Plattform besser geeignet ist. Das Format ist flexibel, solange es 1 bis 4 Byte / Oktett darstellt.
Golf weg!
[0x01, 0x80, 0x02] => 1
?