2088 - decodif

De la Universitas MediaWiki

Se consideră următorul model (pattern): n[string] care este echivalent cu șirul (string)(string)...(string) (string repetat de de n ori). Pornind de la acest model orice șir de caractere poate fi codificat.

Exemple :

Șir codificat

1[a] 2[ab] 2[a2[b]] 3[b2[ca]]

Șir decodificat

a abab abbabb bcacabcacabcaca

Cerința

Fiind dat un șir de caractere corect codificat să se afișeze decodificarea acestuia.

Date de intrare

Programul citește de la tastatură un șir de caractere S corect codificat.

Date de ieșire

Programul va afișa pe ecran un șir de caractere ce va reprezenta decodificarea șirului S.

Restricții și precizări

  • 3 ≤ lungimea șirului S ≤ 1000
  • lungimea șirului decodificat ≤ 100000
  • șirul S va conține doar caractere literă mică ale alfabetului englez

Exemplul 1:

Intrare
3[a1[b2[c]]]
Ieșire
Datele de intrare corespund restrictiilor impuse
abccabccabcc
Intrare
3[a2[c]]2[x3[y]]
Ieșire
Datele de intrare corespund restrictiilor impuse
accaccaccxyyyxyyy

Exemplul 2:

Intrare
2024
Ieșire
Datele de intrare nu corespund restrictiilor impuse

Rezolvare

def validare(sir):  # functia de validare a datelor de intrare
    if len(sir) < 3 or len(sir) > 1000:
        raise ValueError
    if not sir.islower():
        raise ValueError
    print("Datele de intrare corespund restrictiilor impuse\n")


def decode_string(sir):  # functia de rezolvare
    stack = [["", 1]]
    num = ""
    for ch in sir:
        if ch.isdigit():
            num += ch
        elif ch == '[':
            stack.append(["", int(num)])
            num = ""
        elif ch == ']':
            st, k = stack.pop()
            stack[-1][0] += st*k
        else:
            stack[-1][0] += ch
    return stack[0][0]


if __name__ == '__main__':
    try:
        s = input("Introduceți șirul codificat: ").strip()
        validare(s)
        result = decode_string(s)
        print(result)
    except ValueError:
        print("Datele de intrare nu corespund restrictiilor impuse\n")
    except IndexError:
        print("Datele de intrare nu corespund restrictiilor impuse\n")