2088 - decodif

From Bitnami MediaWiki
Revision as of 16:59, 17 November 2023 by Bonte Lucas Gabriel (talk | contribs)
(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

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

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