Python: кодирование длин серий - PullRequest
0 голосов
/ 22 февраля 2019

Я получаю сообщение об ошибке, если ввод содержит только символ без прикрепленной к нему цифры.Например, если пользователь должен был ввести «a2bc», вывод должен быть «aabc».Я должен встретить формат длины пробега.Функция декодирования работает, если ее "a2b1c1".Единственный персонаж не узнает ничего из этого.Я играл с условиями и отладчиком.Кажется, я не могу соответствовать формату длины строки.

Код, показанный ниже, был моей попыткой.Я прокомментировал блок, в котором пытался исправить свои проблемы.

def decode(user_input):

    if not user_input:
        return ""

    else:
        char = user_input[0]
        num = user_input[1]

        if num.isdigit():
            result = char * int(num)

        # elif num.isalpha():
        #     # this should skip to the next two characters

        else:
            result = char * int(num)

        return result + decode(user_input[2:])

test1 = decode("a2b3c1") 
test2 = decode("a2b3c")
print(test1)
print(test2)

(Примечание: вывод для test2 должен быть "aabbbc")
Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Вы должны перейти на 1 вместо 2, когда следующий символ не является цифрой (т. Е. 1 неявно):

def decode(user_input):
    if len(user_input) < 2 : return user_input
    multiplier,skip = (int(user_input[1]),2) if user_input[1].isdigit() else (1,1)
    return user_input[0] * multiplier + decode(user_input[skip:])

обратите внимание, что выполнение этого рекурсивно ограничит размервходная строка, которую вы можете обработать из-за максимального предела рекурсии.

0 голосов
/ 22 февраля 2019

Это требует двух изменений: как вы уже поняли, если num на самом деле не число, то вы используете символ только один раз и пропускаете один символ вперед.В противном случае вы используете номер и пропустите два символа вперед.Но вам также нужно обрабатывать один символ без числа в конце вашей строки.Это можно решить, не только проверив, пусто ли user_input, но и содержит ли он только один символ - в обоих случаях вы можете просто вернуть строку.

def decode(user_input):
    if len(user_input) < 2:
        return user_input

    char = user_input[0]
    num = user_input[1]

    if num.isdigit():
        return char * int(num) + decode(user_input[2:])
    else:
        return char + decode(user_input[1:])
...