2088 - decodif

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

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")