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!
quelle
[0x01, 0x80, 0x02] => 1
?Antworten:
APL (dzaima / APL) , 8 Bytes
Probieren Sie es online!
Wie:
quelle
Pari / GP , 24 Bytes
Probieren Sie es online!
quelle
Wolfram Language (Mathematica) , 25 Byte
Probieren Sie es online!
Wolfram Language (Mathematica) , 25 Byte
Probieren Sie es online!
quelle
J , 10 Bytes
Probieren Sie es online!
Inspiriert von J Salles APL-Antwort.
128|]
Rest der eingegebenen Zahlen geteilt durch 128128#.
Ausgelegt als die Ziffern einer 128er Basiszahlquelle
Gelee , 6 Bytes
Probieren Sie es online!
Entspricht der Pari / GP-Antwort von Alephalpha .
quelle
05AB1E , 6 Bytes
Probieren Sie es online!
128
quelle
7o
. Heutzutage können Sie bestimmte 3-Byte-Ganzzahlen (Bereich[101,355]
) in 2 Bytes komprimieren , so dass 128ƵR
sowieso sein können. Ich habe mich auch über das 2-Byte-Builtin für 16 gewundert. Normalerweise verwenden Sie einfach das Literal wir würden oder auf andere Weise haben4o
/4n
/8·
wenn eine Ziffer dahinter im Programm ist. Nur wenn eine Ziffer vor der 16 steht, was meiner Meinung nach nicht passieren würde, ist das eingebaute nützlich.Stax , 8 Bytes
Führen Sie es aus und debuggen Sie es
Algorithmus:
quelle
JavaScript (ES6), 29 Byte
-2 Bytes dank @Shaggy
Nimmt die Eingabe als Array von Bytes.
Probieren Sie es online!
quelle
APL + WIN, 22 Bytes
Fordert zur Eingabe eines Ganzzahlvektors auf:
Probieren Sie es online! Mit freundlicher Genehmigung von Dyalog Classic
Erläuterung:
quelle
Stax , 12 Bytes
Führen Sie es aus und debuggen Sie es unter staxlang.xyz!
Entpackt (14 Bytes) und Erklärung:
Stax hat eine integrierte Basiskonvertierung, die jedoch nur für Zeichenfolgen funktioniert. Es funktioniert jedoch fast auf Listen mit ganzen Zahlen. Das Problem liegt in der Handhabung von Stax
0
.Eine Zeichenfolge ist eine Liste von Ganzzahlen. Wenn Sie eine solche Liste als Zeichenfolge verwenden, werden alle Nullen automatisch in 32 umgewandelt, um eine gute Abkürzung für Leerzeichen zu erhalten. Da der
|b
für die Basiskonvertierung eingebaute Operand als Zeichenfolge und nicht als unformatierte Liste von Ganzzahlen behandelt wird, schlägt jeder Fall mit einer Null fehl.10 Bytes, fehlgeschlagen bei Nullen
Führen Sie es aus und debuggen Sie es unter staxlang.xyz!
quelle
{:B7)m$:b
Packs zu 8, und scheint auch zu funktionieren, obwohl es eine Art exotische Verwendung von ist$
.C (gcc) , 48 Bytes
Übernimmt eine Ganzzahl in Big-Endian-Reihenfolge als Eingabe. Dies entspricht der Reihenfolge eines Byte-Arrays.
Probieren Sie es online!
C (gcc) , 53 Bytes
Wenn ein Byte-Array benötigt wird:
Probieren Sie es online!
quelle
-O0
, mit dem Sie (normalerweise) einen Rückgabewert im ersten Parameter speichern können. Dies ist eine Besonderheit beim Code-Golfen, funktioniert jedoch nicht mit höheren Optimierungsstufen.&128
mit>>7
.MathGolf , 14 Bytes
Eingabe als Ganzzahl.
Probieren Sie es online aus.
Ich habe das Gefühl, dass dies kürzer sein kann. Es ist ein bisschen ärgerlich, dass MathGolf eine 1-Byte-integrierte Konstante hat
128
, aber keine Basisumwandlung (außer binär / hexadezimal).Erläuterung:
quelle
Python 3 ,
5849 Bytes-9 Bytes dank @Chas und @ ar4093
Probieren Sie es online!
oder
Probieren Sie es online!
Eingabe über Liste von Ganzzahlen.
Pythons
bin
Funktion fügt "0b" am Anfang der Zeichenkette hinzu, sodass diese entfernt werden müssen, bevor sie verkettet werden können.Es werden auch keine führenden Nullen beibehalten. Wenn also keine (auch bekannt als das letzte Byte) vorhanden sind, müssen diese erneut hinzugefügt werden. Wenn es eine führende (auch bekannt als alle bis auf das letzte Byte) gibt, müssen diese als entfernt werden Gut.Vielen Dank an @Chas, der herausgefunden hat, dass ich durch Setzen des ersten Bits einfach die ersten drei Zeichen entfernen und fertig bin.Anscheinend (gemäß @ ar4093)
format
erlaubt die Funktion nicht nur, das Präfix '0b' nicht zu haben, sondern auch das erste Bit zu entfernen und alle gleichzeitig auf 7 Zeichen aufzufüllen.quelle
bin(a|128)[3:]
da Sie das dann nicht benötigenzfill
.bin(a)[2:].zfill(8)[1:]
->f"{a%128:07b}"
PHP , 42 Bytes
Probieren Sie es online! und überprüfen Sie alle Testfälle .
Eingabe über Kommandozeilenargumente, Ausgabe an
STDOUT
.quelle
Japt ,
108 BytesNimmt die Eingabe als Array von Ganzzahlen.
Probieren Sie es aus oder führen Sie alle Testfälle aus (Header in beiden Konvertierungen aus dem in challenge verwendeten Eingabeformat)
2 Bytes gespart, indem man sich von Alephalphas Lösung inspirieren ließ .
quelle
Holzkohle , 11 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Übernimmt die Eingabe als Array. Erläuterung:
quelle
Python 2 , 42 Bytes
Probieren Sie es online!
quelle
Windows Batch, 76 Bytes
Übergeben Sie Parameter mit dem Präfix "0x" und einem Leerzeichen dazwischen (z. B. 0xC0 0x80 0x80 0x00).
quelle
@set y=,ax=
zwischen den Läufen eine Prüfung durchgeführt wird .