2088 - decodif

From Bitnami MediaWiki
Revision as of 17:14, 31 October 2023 by Bonte Lucas Gabriel (talk | contribs) (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...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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

Exemplu:

Intrare
3[a1[b2[c]]]
Ieșire
abccabccabcc
Intrare
3[a2[c]]2[x3[y]]
Ieșire
accaccaccxyyyxyyy

Rezolvare

<syntaxhighlight lang="python" line="1" start="1">

  1. Funcția care decodifică șirul

def decode_string(s):

   # Inițializăm stiva cu un șir gol și un număr 1
   stack = []
   stack.append(["", 1])
   num = ""
   # Parcurgem fiecare caracter din șir
   for ch in s:
       if ch.isdigit():
           # Dacă caracterul este o cifră, o adăugăm la numărul curent
           num += ch
       elif ch == '[':
           # Dacă întâlnim un '[', adăugăm un nou element în stivă cu șirul curent și numărul curent
           stack.append(["", int(num)])
           num = ""
       elif ch == ']':
           # Dacă întâlnim un ']', scoatem elementul din vârful stivei, îl repetăm de un număr de ori și îl adăugăm la șirul din următorul element din stivă
           st, k = stack.pop()
           stack[-1][0] += st*k
       else:
           # Dacă întâlnim o literă, o adăugăm la șirul din vârful stivei
           stack[-1][0] += ch
   # La sfârșit, returnăm șirul din primul element al stivei
   return stack[0][0]
  1. Citim șirul de la tastatură

s = input("Introduceți șirul codificat: ")

  1. Apelăm funcția și afișăm rezultatul

print(decode_string(s))

</syntaxhighlight>