0874 - Atomi: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Cerința == Într-un laborator de fizică atomică, oamenii de știință lucrează cu o serie de atomi pe care trebuie să-i organizeze folosind structuri de date liniare, în special stive. Atomii sunt reprezentați de litere, și pentru a realiza diverse experimente, trebuie să proceseze acești atomi conform unor operațiuni de adăugare și eliminare. Sarcina ta este să implementezi un program care să simuleze aceste operațiuni asupra unei stive. == Date de intrar...
 
No edit summary
 
Line 1: Line 1:
== Cerința ==
== Cerința ==
Într-un laborator de fizică atomică, oamenii de știință lucrează cu o serie de atomi pe care trebuie să-i organizeze folosind structuri de date liniare, în special stive. Atomii sunt reprezentați de litere, și pentru a realiza diverse experimente, trebuie să proceseze acești atomi conform unor operațiuni de adăugare și eliminare. Sarcina ta este să implementezi un program care să simuleze aceste operațiuni asupra unei stive.
Într-o galaxie îndepărtată există doar două elemente chimice. Cercetătorii le-au numit A şi B şi toate substanțele sunt alcătuite din aceste elemente. Mai precis, o substanță este un șir definit astfel:
 
A și B sunt substanțe, formate din câte un atom;
Ax și By sunt substanțe, x și y find numere naturale. Ax este formată din x atomi de tip A, iar By este formată din y atomi de tip B;
dacă S este substanță atunci (S)x este substanță, x fiind un număr natural. Dacă în S sunt p atomi, în (S)x vor fi p*x atomi;
dacă S şi T sunt substanțe atunci ST este substanță. Dacă în S sunt x atomi, iar în T sunt y atomi, în ST vor fi x+y atomi.
Pentru o substanță dată să se determine numărul atomilor de tip A şi numărul atomilor de tip B care o compun.
== Date de intrare ==
== Date de intrare ==
Programul citește de la tastatură:
Programul citește de la tastatură numărul un şir de caractere reprezentând substanța dată.
 
Un număr întreg n reprezentând numărul de operațiuni.
O listă de n operațiuni, fiecare operațiune fiind de forma "PUSH X" (unde X este o literă) sau "POP".
== Date de ieșire ==
== Date de ieșire ==
Pe ecran se va afișa stiva rezultată după efectuarea tuturor operațiunilor. Dacă o operațiune "POP" este efectuată pe o stivă goală, se va afișa mesajul "Eroare: stivă goală".
Programul va afișa pe ecran două numere nA nB, separate printr-un spațiu, reprezentând numărul atomilor de tip A, respectiv numărul atomilor de tip B din substanța dată.
== Restricții și precizări ==
== Restricții și precizări ==
*1 ⩽ '''n''' ⩽ 100
*șirul dat are cel mult 255 de caractere
*1 'x' este întotdeauna o literă a alfabetului englez
== Exemplu 1 ==
== Exemplu 1 ==
;Intrare
;Intrare
5<br>
(A3B2)2A3(B2)2
PUSH A<br>
PUSH B<br>
POP<br>
PUSH C<br>
PUSH D
 
;Iesire
['A', 'C', 'D']
 
== Exemplu 2 ==
;Intrare
4<br>
PUSH X<br>
POP<br>
POP<br>
PUSH Y


;Iesire
;Iesire
Eroare: stivă goală
9 8
['Y']


Datele de intrare nu corespund restricțiilor impuse.
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
def citeste_date():
def numara_atomi(expresie):
     try:
     stack = []
        n = int(input("Introduceți numărul de operațiuni (n): "))
    i = 0
         operatiuni = []
    n = len(expresie)
        for _ in range(n):
   
             operatiune = input().strip()
    while i < n:
             operatiuni.append(operatiune)
         if expresie[i] == '(':
         return n, operatiuni
             stack.append('(')
    except ValueError:
             i += 1
        return None, None
         elif expresie[i] == ')':
 
            sub_exp = []
def valideaza_date(n, operatiuni):
            while stack and stack[-1] != '(':
    if not (1 <= n <= 100):
                sub_exp.append(stack.pop())
        return False
             stack.pop() # scoatem '('
    for operatiune in operatiuni:
            sub_exp.reverse()
        if not (operatiune.startswith("PUSH ") or operatiune == "POP"):
            i += 1
             return False
             coef = 0
        if operatiune.startswith("PUSH ") and len(operatiune.split()) != 2:
            while i < n and expresie[i].isdigit():
             return False
                coef = coef * 10 + int(expresie[i])
        if operatiune.startswith("PUSH ") and not operatiune.split()[1].isalpha():
                i += 1
            return False
            coef = max(coef, 1)
    return True
            for elem in sub_exp:
 
                stack.append((elem[0], elem[1] * coef, elem[2] * coef))
def proceseaza_operatiuni(n, operatiuni):
        elif expresie[i] in 'AB':
    stiva = []
             tip = expresie[i]
    for operatiune in operatiuni:
            i += 1
        if operatiune.startswith("PUSH "):
            numar = 0
             _, valoare = operatiune.split()
            while i < n and expresie[i].isdigit():
            stiva.append(valoare)
                numar = numar * 10 + int(expresie[i])
        elif operatiune == "POP":
                i += 1
             if stiva:
            numar = max(numar, 1)
                 stiva.pop()
             if tip == 'A':
                 stack.append(('A', numar, 0))
             else:
             else:
                 print("Eroare: stivă goală")
                 stack.append(('B', 0, numar))
     return stiva
        else:
            i += 1
   
    total_A = 0
    total_B = 0
    for elem in stack:
        total_A += elem[1]
        total_B += elem[2]
   
     return total_A, total_B


def main():
def main():
     n, operatiuni = citeste_date()
     expresie = input().strip()
      
      
     if n is None or operatiuni is None or not valideaza_date(n, operatiuni):
     # Verificăm restricția privind lungimea expresiei
        print("Datele de intrare nu corespund restricțiilor impuse.")
    assert len(expresie) <= 255, "Expresia trebuie să aibă cel mult 255 de caractere"
        return
      
      
     print("Datele de intrare corespund restricțiilor impuse.")
     nA, nB = numara_atomi(expresie)
    rezultat = proceseaza_operatiuni(n, operatiuni)
     print(f"{nA} {nB}")
     print(rezultat)


if __name__ == "__main__":
if __name__ == "__main__":
     main()
     main()


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 22:16, 2 June 2024

Cerința

Într-o galaxie îndepărtată există doar două elemente chimice. Cercetătorii le-au numit A şi B şi toate substanțele sunt alcătuite din aceste elemente. Mai precis, o substanță este un șir definit astfel:

A și B sunt substanțe, formate din câte un atom; Ax și By sunt substanțe, x și y find numere naturale. Ax este formată din x atomi de tip A, iar By este formată din y atomi de tip B; dacă S este substanță atunci (S)x este substanță, x fiind un număr natural. Dacă în S sunt p atomi, în (S)x vor fi p*x atomi; dacă S şi T sunt substanțe atunci ST este substanță. Dacă în S sunt x atomi, iar în T sunt y atomi, în ST vor fi x+y atomi. Pentru o substanță dată să se determine numărul atomilor de tip A şi numărul atomilor de tip B care o compun.

Date de intrare

Programul citește de la tastatură numărul un şir de caractere reprezentând substanța dată.

Date de ieșire

Programul va afișa pe ecran două numere nA nB, separate printr-un spațiu, reprezentând numărul atomilor de tip A, respectiv numărul atomilor de tip B din substanța dată.

Restricții și precizări

  • șirul dat are cel mult 255 de caractere

Exemplu 1

Intrare

(A3B2)2A3(B2)2

Iesire

9 8

Rezolvare

<syntaxhighlight lang="python" line> def numara_atomi(expresie):

   stack = []
   i = 0
   n = len(expresie)
   
   while i < n:
       if expresie[i] == '(':
           stack.append('(')
           i += 1
       elif expresie[i] == ')':
           sub_exp = []
           while stack and stack[-1] != '(':
               sub_exp.append(stack.pop())
           stack.pop()  # scoatem '('
           sub_exp.reverse()
           i += 1
           coef = 0
           while i < n and expresie[i].isdigit():
               coef = coef * 10 + int(expresie[i])
               i += 1
           coef = max(coef, 1)
           for elem in sub_exp:
               stack.append((elem[0], elem[1] * coef, elem[2] * coef))
       elif expresie[i] in 'AB':
           tip = expresie[i]
           i += 1
           numar = 0
           while i < n and expresie[i].isdigit():
               numar = numar * 10 + int(expresie[i])
               i += 1
           numar = max(numar, 1)
           if tip == 'A':
               stack.append(('A', numar, 0))
           else:
               stack.append(('B', 0, numar))
       else:
           i += 1
   
   total_A = 0
   total_B = 0
   for elem in stack:
       total_A += elem[1]
       total_B += elem[2]
   
   return total_A, total_B

def main():

   expresie = input().strip()
   
   # Verificăm restricția privind lungimea expresiei
   assert len(expresie) <= 255, "Expresia trebuie să aibă cel mult 255 de caractere"
   
   nA, nB = numara_atomi(expresie)
   print(f"{nA} {nB}")

if __name__ == "__main__":

   main()


</syntaxhighlight>