0874 - Atomi: Difference between revisions
Benzar Ioan (talk | contribs) 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... |
Benzar Ioan (talk | contribs) No edit summary |
||
Line 1: | Line 1: | ||
== Cerința == | == Cerința == | ||
Într-un | Î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ă. | ||
== Date de ieșire == | == 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 == | == Restricții și precizări == | ||
* | *șirul dat are cel mult 255 de caractere | ||
== Exemplu 1 == | == Exemplu 1 == | ||
;Intrare | ;Intrare | ||
(A3B2)2A3(B2)2 | |||
;Iesire | ;Iesire | ||
9 8 | |||
== Rezolvare == | == Rezolvare == | ||
<syntaxhighlight lang="python" line> | <syntaxhighlight lang="python" line> | ||
def | 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 | |||
if | numar = max(numar, 1) | ||
if tip == 'A': | |||
stack.append(('A', numar, 0)) | |||
else: | else: | ||
stack.append(('B', 0, numar)) | |||
return | 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(): | ||
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}") | |||
print( | |||
if __name__ == "__main__": | if __name__ == "__main__": | ||
main() | main() | ||
</syntaxhighlight> | </syntaxhighlight> |
Latest revision as of 22:16, 2 June 2024
Cerința[edit | edit source]
Î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[edit | edit source]
Programul citește de la tastatură numărul un şir de caractere reprezentând substanța dată.
Date de ieșire[edit | edit source]
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[edit | edit source]
- șirul dat are cel mult 255 de caractere
Exemplu 1[edit | edit source]
- Intrare
(A3B2)2A3(B2)2
- Iesire
9 8
Rezolvare[edit | edit source]
<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>