I’m trying to make a run length decoder that doesn’t use 1s. For example a string that could be passed through would be something like ”’ A2C3GTA”’. I made what i thought would work and am having trouble finding where I went wrong. I’m a beginner to python so I am sorry for the simple question. Thank you!
def decode(compressed): decoded= "" count = 0 for x in compressed : if x.isdigit(): count += int(x) y = compressed decoded += y[int(x)+1] * count count = 0 else : decoded += x print (decoded)
Advertisement
Answer
When you find a number-letter pair, you fail to skip the letter after you expand the pair. This is because you used a for
loop, which is a more restrictive structure than your logic wants. Instead, try:
idx = 0 while idx < len(compressed): char = compressed[idx] if char.isdigit(): # replicate next character idx += 2 else: decoded += char idx += 1
That will take care of your iteration.
Your in appropriate replication, the 22
in your output, this comes from an incorrect reference to the position:
decoded += y[int(x)+1] * count
Here, x
is the run length, not the position of the character. If the input were A7B
, this ill-formed expression would fault because of an index out of bounds.
In the code I gave you above, simply continue to use idx
as the index.
I trust you can finish from here.