variable-length-quantity: Add new exercise (#468)
This commit is contained in:
34
exercises/variable-length-quantity/example.py
Normal file
34
exercises/variable-length-quantity/example.py
Normal file
@@ -0,0 +1,34 @@
|
||||
EIGHTBITMASK = 0x80
|
||||
SEVENBITSMASK = 0x7f
|
||||
|
||||
|
||||
def encode_single(n):
|
||||
bytes = [n & SEVENBITSMASK]
|
||||
n >>= 7
|
||||
|
||||
while n > 0:
|
||||
bytes.append(n & SEVENBITSMASK | EIGHTBITMASK)
|
||||
n >>= 7
|
||||
|
||||
return bytes[::-1]
|
||||
|
||||
|
||||
def encode(numbers):
|
||||
return sum((encode_single(n) for n in numbers), [])
|
||||
|
||||
|
||||
def decode(bytes):
|
||||
values = []
|
||||
n = 0
|
||||
|
||||
for i, byte in enumerate(bytes):
|
||||
n <<= 7
|
||||
n += (byte & SEVENBITSMASK)
|
||||
|
||||
if byte & EIGHTBITMASK == 0:
|
||||
values.append(n)
|
||||
n = 0
|
||||
elif i == len(bytes) - 1:
|
||||
raise ValueError('incomplete byte sequence')
|
||||
|
||||
return values
|
||||
Reference in New Issue
Block a user