0874 - Atomi: Diferență între versiuni

De la Universitas 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...)
 
Fără descriere a modificării
 
Linia 1: Linia 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 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ă 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>

Versiunea curentă din 2 iunie 2024 22:16

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

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