可変長数値表現(とも称されるVLQまたはuintvar
)必要なバイト数としてのみ使用して28ビット整数値まで符号化する方法です。これは、特定のイベントデータのサイズを最小化する方法として、MIDIファイル形式で使用されていました。
仕組みはかなり簡単です。ビッグエンディアンの一連のバイトとして、各バイトの最上位ビット(MSB)1
は、別のVLQバイトが続くことを示すためのものです。各バイトの残りの7ビットは、デコードされた値を構成します。
例(ウィキペディアから):
[ 0x86, 0xc3, 0x17 ] => 106903
チャレンジ:
可変長の数量を指定して、整数値に変換します。
入力:
整数の有効なVLQを表す1〜4バイトまたは32ビット値タイプのリスト。
出力:
VLQ入力の整数値。
ルールとスコアリング:
- これはコードゴルフなので、各言語のバイト単位の最短回答が勝ちです。
- 標準ルールとデフォルトのI / Oルールが適用されます。
- (もちろん)禁止されている抜け穴。
- コードのテスト(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
注:バイトを入力または出力として表すために16進リテラルを使用する必要はありません。プラットフォームに適している場合は[ 129, 128, 0 ]
、10進リテラル()、整数(0x80818000
)、またはその他の適切なバイト/オクテット表現を使用できます。1〜4バイト/オクテットを表す限り、フォーマットは柔軟です。
離れてゴルフ!
[0x01, 0x80, 0x02] => 1
ますか?