<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=1971_-_Plus</id>
	<title>1971 - Plus - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=1971_-_Plus"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1971_-_Plus&amp;action=history"/>
	<updated>2026-05-01T04:33:48Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1971_-_Plus&amp;diff=8848&amp;oldid=prev</id>
		<title>Zmicala Narcis: Pagină nouă: Locuitorii planetei Aritmo au hotărât ca în celebrul an 2012 să le explice pământenilor metoda plus de adunare a numerelor naturale pe planeta lor. La fel ca și planetele, înainte de adunare, numerele se aliniază astfel încât să se obțină cât mai multe cifre egale pe aceleași poziții. Cifrele egale, astfel obținute, se elimină din cele două numere. Pentru a obține rezultatul final, se adună cele două numerele deplasate, obținute după eliminare, ca în...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1971_-_Plus&amp;diff=8848&amp;oldid=prev"/>
		<updated>2024-01-03T14:28:53Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: Locuitorii planetei Aritmo au hotărât ca în celebrul an 2012 să le explice pământenilor metoda plus de adunare a numerelor naturale pe planeta lor. La fel ca și planetele, înainte de adunare, numerele se aliniază astfel încât să se obțină cât mai multe cifre egale pe aceleași poziții. Cifrele egale, astfel obținute, se elimină din cele două numere. Pentru a obține rezultatul final, se adună cele două numerele deplasate, obținute după eliminare, ca în...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Locuitorii planetei Aritmo au hotărât ca în celebrul an 2012 să le explice pământenilor metoda plus de adunare a numerelor naturale pe planeta lor. La fel ca și planetele, înainte de adunare, numerele se aliniază astfel încât să se obțină cât mai multe cifre egale pe aceleași poziții. Cifrele egale, astfel obținute, se elimină din cele două numere. Pentru a obține rezultatul final, se adună cele două numerele deplasate, obținute după eliminare, ca în exemplu.&lt;br /&gt;
&lt;br /&gt;
Exemplu: Numerele 18935 și 85352 se aliniază ca în figura de mai jos. După eliminare se obțin numerele 19 și 52 care se adună deplasate, pentru a obține rezultatul final. Așadar 18935 plus 85352=242.&lt;br /&gt;
&lt;br /&gt;
: 18935 plus    19 +&lt;br /&gt;
:  85352         52&lt;br /&gt;
:               ---&lt;br /&gt;
:               242&lt;br /&gt;
Dacă există mai multe posibilități de a alinia numerele astfel încât să se elimine același număr maxim de cifre, atunci numerele sunt aliniate astfel încât, după eliminare şi adunarea numerelor după metoda descrisă, să se obțină o valoare cât mai mare.&lt;br /&gt;
&lt;br /&gt;
Exemplu: &amp;#039;&amp;#039;&amp;#039;22331 plus 3322 = 33331&amp;#039;&amp;#039;&amp;#039; (există două moduri în care cele două numere pot fi aliniate astfel încât să se elimine un număr maxim de cifre, valoarea maximă obținându-se atunci când se elimină cele două cifre 2)&lt;br /&gt;
&lt;br /&gt;
: 22331      221 +       22331      331+&lt;br /&gt;
:   3322       22      3322       33&lt;br /&gt;
:            ----                 -----&lt;br /&gt;
:            2232                 33331&lt;br /&gt;
Dacă două numere a și b sunt identice sau nu au cifre comune atunci a plus b=0. Dacă se elimină toate cifrele unui număr atunci rezultatul este dat de cifrele rămase în celălalt număr. Exemple: &amp;#039;&amp;#039;&amp;#039;23 plus 523=5, 562 plus 56=2&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Adunarea mai multor numere se face de la stânga la dreapta: se adună primele două numere conform metodei descrise mai sus, apoi rezultatul se adună cu al treilea, și așa mai departe.&lt;br /&gt;
&lt;br /&gt;
Într-o expresie în care se adună mai multe numere pot să apară paranteze rotunde. În evaluarea unei asemenea expresii, numită expresie parantezată, se efectuează mai întâi adunările din paranteze conform metodei descrise mai sus, parantezele fiind apoi înlocuite cu rezultatul adunărilor din paranteze.&lt;br /&gt;
&lt;br /&gt;
Se definește adâncimea A­­­­d(E) corespunzătoare unei expresii parantezate E astfel:&lt;br /&gt;
&lt;br /&gt;
* dacă expresia &amp;#039;&amp;#039;&amp;#039;E&amp;#039;&amp;#039;&amp;#039; nu conține paranteze, atunci adâncimea acesteia este &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
* dacă expresia &amp;#039;&amp;#039;&amp;#039;E&amp;#039;&amp;#039;&amp;#039; este de forma &amp;#039;&amp;#039;&amp;#039;(F)&amp;#039;&amp;#039;&amp;#039;, atunci &amp;#039;&amp;#039;&amp;#039;A­­­­d(E)=1+A­­­­d(F)&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
* dacă expresia &amp;#039;&amp;#039;&amp;#039;E&amp;#039;&amp;#039;&amp;#039; este de forma &amp;#039;&amp;#039;&amp;#039;E1 plus E2…plus Ek&amp;#039;&amp;#039;&amp;#039;, atunci &amp;#039;&amp;#039;&amp;#039;A­­­­d(E)=max(A­­­­d(E1)&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;A­­­­d(E2),…, A­­­­d(Ek­­­))&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
== Cerința ==&lt;br /&gt;
Pentru a-i ajuta pe pământenii care doresc să învețe acest nou mod de adunare, scrieți un program care citește o expresie parantezată și determină:&lt;br /&gt;
a) adâncimea expresiei date;&lt;br /&gt;
b) valoarea acestei expresii.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &amp;#039;&amp;#039;&amp;#039;plusin.txt&amp;#039;&amp;#039;&amp;#039; conține pe prima linie un număr natural &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039;. Pe următoarele &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; linii se află descrierea expresiei parantezate. Pe fiecare dintre aceste linii se află un număr natural sau una dintre valorile &amp;#039;&amp;#039;&amp;#039;-1&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;-2&amp;#039;&amp;#039;&amp;#039;. Valoarea &amp;#039;&amp;#039;&amp;#039;-1&amp;#039;&amp;#039;&amp;#039; reprezintă o paranteză rotundă deschisă iar valoarea &amp;#039;&amp;#039;&amp;#039;-2&amp;#039;&amp;#039;&amp;#039; reprezintă o paranteză rotundă închisă.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &amp;#039;&amp;#039;&amp;#039;plusout.txt&amp;#039;&amp;#039;&amp;#039; va conține:&lt;br /&gt;
a) pe prima linie numărul natural ce reprezintă adâncimea expresiei date;&lt;br /&gt;
b) pe a doua linie se va scrie numărul natural ce reprezintă rezultatul evaluării expresiei date, adunarea numerelor făcându-se conform metodei descrise.&lt;br /&gt;
== Restricții și precizări ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;1&amp;lt;n≤2000&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
* fiecare dintre celelalte numere naturale din fișier are cel mult 9 cifre;&lt;br /&gt;
* în fiecare paranteză se află cel puțin un număr natural;&lt;br /&gt;
* dacă într-o paranteză se află un singur număr natural, atunci valoarea expresiei este egală cu valoarea numărului din paranteză;&lt;br /&gt;
* pentru rezolvarea corectă a cerinței a) se acordă 20% din punctaj, iar pentru rezolvarea corectă a ambelor cerinţe se acordă punctajul integral.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; plusin.txt&lt;br /&gt;
: 12&lt;br /&gt;
: -1&lt;br /&gt;
: 1343 &lt;br /&gt;
: -1&lt;br /&gt;
: 234 &lt;br /&gt;
: 4532 &lt;br /&gt;
: -2&lt;br /&gt;
: -2&lt;br /&gt;
: 14091&lt;br /&gt;
: -1&lt;br /&gt;
: 21&lt;br /&gt;
: 2&lt;br /&gt;
: -2&lt;br /&gt;
; plusout.txt&lt;br /&gt;
: Datele introduse corespund restricțiilor impuse.&lt;br /&gt;
: 2&lt;br /&gt;
: 4639&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Expresia parantezată care trebuie evaluată este:&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;(1343 plus (234 plus 4532)) plus 14091 plus (21 plus 2)=&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;(1343 plus 45334)plus 14091 plus (21 plus 2) =&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;4543 plus 14091 plus (21 plus 2)=&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;4543 plus 14091 plus 1=&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;46391 plus 1=4639&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Valoarea expresei este &amp;#039;&amp;#039;&amp;#039;4639&amp;#039;&amp;#039;&amp;#039;. Adâncimea expresiei este &amp;#039;&amp;#039;&amp;#039;2&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; plusin.txt&lt;br /&gt;
: 13&lt;br /&gt;
: -1&lt;br /&gt;
: 1343&lt;br /&gt;
: -1&lt;br /&gt;
: 234&lt;br /&gt;
: 4532&lt;br /&gt;
: -2&lt;br /&gt;
: -2&lt;br /&gt;
: 14091&lt;br /&gt;
: -1&lt;br /&gt;
: 21&lt;br /&gt;
: 2&lt;br /&gt;
: -2&lt;br /&gt;
: 1000000000&lt;br /&gt;
; plusout.txt&lt;br /&gt;
: Datele introduse nu corespund restricțiilor impuse.&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 1971 - Plus&lt;br /&gt;
def validare(op):           # functia de validare a datelor de intrare&lt;br /&gt;
    if len(op) &amp;gt; 2000:&lt;br /&gt;
        raise ValueError&lt;br /&gt;
    for operatie in op:&lt;br /&gt;
        if operatie != -1 and operatie != -2 and (operatie &amp;lt; 1 or operatie &amp;gt; 999999999):&lt;br /&gt;
            raise ValueError&lt;br /&gt;
    fisier_iesire.write(&amp;quot;Datele de intrare corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def plus(op):                     # functia de rezolvare&lt;br /&gt;
    if len(op) == 0:&lt;br /&gt;
        fisier_iesire.write(&amp;quot;0\n&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    stiva = []&lt;br /&gt;
    adancime = 0&lt;br /&gt;
    for operatie in op:&lt;br /&gt;
        if operatie == -1:&lt;br /&gt;
            stiva.append([])&lt;br /&gt;
            adancime = max(adancime, len(stiva))&lt;br /&gt;
        elif operatie == -2:&lt;br /&gt;
            if len(stiva[-1]) == 1:&lt;br /&gt;
                if len(stiva) &amp;gt; 1:&lt;br /&gt;
                    stiva[-2].append(stiva[-1][0])&lt;br /&gt;
                stiva.pop()&lt;br /&gt;
            else:&lt;br /&gt;
                numere = stiva.pop()&lt;br /&gt;
                while len(numere) &amp;gt; 1:&lt;br /&gt;
                    a = numere.pop()&lt;br /&gt;
                    b = numere.pop()&lt;br /&gt;
                    numere.append(a + b - int(str(a) + str(b)))&lt;br /&gt;
                if len(stiva) &amp;gt; 0:&lt;br /&gt;
                    stiva[-1].append(numere[0])&lt;br /&gt;
        else:&lt;br /&gt;
            stiva[-1].append(operatie)&lt;br /&gt;
    fisier_iesire.write(str(adancime) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
    fisier_iesire.write(str(stiva[0][0]) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
    fisier_intrare = open(&amp;quot;plusin.txt&amp;quot;, &amp;quot;r&amp;quot;)         # declararea fisierelor&lt;br /&gt;
    fisier_iesire = open(&amp;quot;plusout.txt&amp;quot;, &amp;quot;w&amp;quot;)       # fisierul out trebuie declarat cu optiunea &amp;quot;w&amp;quot; (write)&lt;br /&gt;
&lt;br /&gt;
    try:&lt;br /&gt;
        N = int(fisier_intrare.readline())&lt;br /&gt;
        operatii = [int(linie) for linie in fisier_intrare.readlines()]&lt;br /&gt;
&lt;br /&gt;
        validare(operatii)                 # apelul functiei de validare&lt;br /&gt;
        plus(operatii)               # apelul functiei de rezolvare&lt;br /&gt;
&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        fisier_iesire.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
    except IndexError:&lt;br /&gt;
        fisier_iesire.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zmicala Narcis</name></author>
	</entry>
</feed>