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