2088 - decodif: Difference between revisions

From Bitnami MediaWiki
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


==Exemplu:==
==Exemplul 1:==


;Intrare
;Intrare


:3[a1[b2[c]]]
3[a1[b2[c]]]


;Ieșire
;Ieșire


:abccabccabcc
Datele de intrare corespund restrictiilor impuse
abccabccabcc


;Intrare
;Intrare


:3[a2[c]]2[x3[y]]
3[a2[c]]2[x3[y]]


;Ieșire
;Ieșire


:accaccaccxyyyxyyy
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">


# Funcția care decodifică șirul
def validare(sir):  # functia de validare a datelor de intrare
def decode_string(s):
    if len(sir) < 3 or len(sir) > 1000:
    # Inițializăm stiva cu un șir gol și un număr 1
        raise ValueError
     stack = []
    if not sir.islower():
    stack.append(["", 1])
        raise ValueError
    print("Datele de intrare corespund restrictiilor impuse\n")
 
 
def decode_string(sir): # functia de rezolvare
     stack = [["", 1]]
     num = ""
     num = ""
    # Parcurgem fiecare caracter din șir
     for ch in sir:
     for ch in s:
         if ch.isdigit():
         if ch.isdigit():
            # Dacă caracterul este o cifră, o adăugăm la numărul curent
             num += ch
             num += ch
         elif 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)])
             stack.append(["", int(num)])
             num = ""
             num = ""
         elif ch == ']':
         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()
             st, k = stack.pop()
             stack[-1][0] += st*k
             stack[-1][0] += st*k
         else:
         else:
            # Dacă întâlnim o literă, o adăugăm la șirul din vârful stivei
             stack[-1][0] += ch
             stack[-1][0] += ch
    # La sfârșit, returnăm șirul din primul element al stivei
     return stack[0][0]
     return stack[0][0]


# Citim șirul de la tastatură
s = input("Introduceți șirul codificat: ")


# Apelăm funcția și afișăm rezultatul
if __name__ == '__main__':
print(decode_string(s))
    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]

Fiind dat un șir de caractere corect codificat să se afișeze decodificarea acestuia.

Date de intrare[edit]

Programul citește de la tastatură un șir de caractere S corect codificat.

Date de ieșire[edit]

Programul va afișa pe ecran un șir de caractere ce va reprezenta decodificarea șirului S.

Restricții și precizări[edit]

  • 3 ≤ lungimea șirului S ≤ 1000
  • lungimea șirului decodificat ≤ 100000
  • șirul S va conține doar caractere literă mică ale alfabetului englez

Exemplul 1:[edit]

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]

Intrare
2024
Ieșire
Datele de intrare nu corespund restrictiilor impuse

Rezolvare[edit]

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