For a school assignment I have to write an encoder and decoder in Python, which takes a string of encoded characters as so : "2k3b" and decodes them into "kkbbb". I have already written the encoder and tested it with pytest, but I can't seem to wrap my head around writing the decoder. The code for the encoder and decoder respectively is posted below.
def encode(mess):
""" Run length encoding - convert string from 'wwwwwwbbbb' til '6w4b'"""
res = []
old_val = mess[0]
count = 0
for char in mess:
if char == old_val:
count += 1
else:
res.append('%d%c' % (count, old_val))
old_val = char
count = 1
res.append('%d%c' % (count, char))
return ''.join(res)
I know that last res.append('%d%c' % (count, char))
is bad coding, but I just had to make it work and i'm not experienced enough in Python.
def decode(mess):
"""Run length decoding - convert string from '2k3b' to 'kkbbb'"""
res = []
num = 0
letter = ''
for char in mess:
mess.split()
if char.isdigit():
num = int(char)
else:
num = 0
res.append(num * '%c' % letter)
return ''.join(res)
The decoder is not finished it's just were I stopped because I couldn't "see" what I was supposed to do. I usually write pseudo-code for all assigments and I did so for both the encoder and decoder but for some reason the decoder isn't getting through to me. I believe that I just lost my trail of thought but I could really use some guidance on this one. I'm reluctant to ask my teacher because he will just show me his code and I won't learn anything from that.
You are almost there. Below is your approach but with few minor changes.
def decode(mess):
"""Run length decoding - convert string from '2k3b' to 'kkbbb'"""
res = []
num = ''
for char in mess:
#If char an integer just add it to current num
# required for cases where integer will be greater than 9.
if char.isdigit():
num += char
else:
# "a"* int("3") = "aaa" we can use this property to expand
# after expanding just set the num to 0
res.append(char*int(num))
num = ''
return ''.join(res)
Test:
>>>print(decode(encode('kkkkkkkkkkkkkkkkkwwkkeeerrr'))=="kkkkkkkkkkkkkkkkkwwkkeeerrr"))
True