2088 - decodif: Difference between revisions
Pagină nouă: 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 a... |
No edit summary |
||
Line 35: | Line 35: | ||
*șirul '''S''' va conține doar caractere literă mică ale alfabetului englez | *șirul '''S''' va conține doar caractere literă mică ale alfabetului englez | ||
== | ==Exemplul 1:== | ||
;Intrare | ;Intrare | ||
3[a1[b2[c]]] | |||
;Ieșire | ;Ieșire | ||
Datele de intrare corespund restrictiilor impuse | |||
abccabccabcc | |||
;Intrare | ;Intrare | ||
3[a2[c]]2[x3[y]] | |||
;Ieșire | ;Ieșire | ||
: | Datele de intrare corespund restrictiilor impuse | ||
accaccaccxyyyxyyy | |||
==Exemplul 2:== | |||
;Intrare | |||
2024 | |||
;Ieșire | |||
Datele de intrare nu corespund restrictiilor impuse | |||
==Rezolvare== | ==Rezolvare== | ||
Line 57: | Line 69: | ||
<syntaxhighlight lang="python" line="1" start="1"> | <syntaxhighlight lang="python" line="1" start="1"> | ||
# | def validare(sir): # functia de validare a datelor de intrare | ||
def decode_string( | if len(sir) < 3 or len(sir) > 1000: | ||
raise ValueError | |||
stack = [ | if not sir.islower(): | ||
raise ValueError | |||
print("Datele de intrare corespund restrictiilor impuse\n") | |||
def decode_string(sir): # functia de rezolvare | |||
stack = [["", 1]] | |||
num = "" | num = "" | ||
for ch in sir: | |||
for ch in | |||
if ch.isdigit(): | if ch.isdigit(): | ||
num += ch | num += ch | ||
elif ch == '[': | elif ch == '[': | ||
stack.append(["", int(num)]) | stack.append(["", int(num)]) | ||
num = "" | num = "" | ||
elif ch == ']': | elif ch == ']': | ||
st, k = stack.pop() | st, k = stack.pop() | ||
stack[-1][0] += st*k | stack[-1][0] += st*k | ||
else: | else: | ||
stack[-1][0] += ch | stack[-1][0] += ch | ||
return stack[0][0] | 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") | |||
</syntaxhighlight> | </syntaxhighlight> |
Latest revision as of 16:59, 17 November 2023
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[edit | edit source]
Fiind dat un șir de caractere corect codificat să se afișeze decodificarea acestuia.
Date de intrare[edit | edit source]
Programul citește de la tastatură un șir de caractere S corect codificat.
Date de ieșire[edit | edit source]
Programul va afișa pe ecran un șir de caractere ce va reprezenta decodificarea șirului S.
Restricții și precizări[edit | edit source]
- 3 ≤ lungimea șirului S ≤ 1000
- lungimea șirului decodificat ≤ 100000
- șirul S va conține doar caractere literă mică ale alfabetului englez
Exemplul 1:[edit | edit source]
- 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:[edit | edit source]
- Intrare
2024
- Ieșire
Datele de intrare nu corespund restrictiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line="1" start="1">
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")
</syntaxhighlight>