0849 - Paranteze2: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: ==Cerința== Se dă un șir de paranteze rotunde care se închid corect (corect parantezat). Să se determine adâncimea parantezării. Pentru un șir de paranteze închise corect '''S''', adâncimea parantezării, '''D(S)''' este definită astfel: dacă șirul '''S''' este vid, '''D(S)=0''' dacă '''S=(T)''', unde '''T''' este un șir de paranteze corect, '''D(S)=1+D(T)''' dacă '''S=AB''', unde '''A''' și '''B''' sunt șiruri de paranteze corecte, '''D(S)=max{D(A),D(B)}...
 
No edit summary
 
Line 11: Line 11:
==Date de intrare==
==Date de intrare==


Fișierul de intrare '''paranteze2.in''' conține pe prima un șir de paranteze rotunde, corect parantezat.
Fișierul de intrare '''paranteze2in.txt''' conține pe prima un șir de paranteze rotunde, corect parantezat.


==Date de ieșire==
==Date de ieșire==


Fișierul de ieșire '''paranteze2.out''' va conține pe prima linie un număr '''M''', reprezentând adâncimea parantezării.
Fișierul de ieșire '''paranteze2out.txt''' va conține pe prima linie un număr '''M''', reprezentând adâncimea parantezării.


==Restricții și precizări==
==Restricții și precizări==
*șirul va conține cel mult '''254''' de paranteze
*șirul va conține cel mult '''254''' de paranteze


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


'''paranteze2.in'''
'''paranteze2in.txt'''


:1
:()((()())())
:()((()())())


'''paranteze2.out'''
'''paranteze2out.txt'''


:Datele de intrare corespund restrictiilor impuse.
:3
:3
==Exemplul 2:==
'''paranteze2in.txt'''
:h
'''paranteze2out.txt'''
:Datele de intrare nu corespund restrictiilor impuse.


==Rezolvare==
==Rezolvare==
Line 34: Line 48:
<syntaxhighlight lang="python" line="1" start="1">
<syntaxhighlight lang="python" line="1" start="1">


def adancime_parantezare(sir):
def validare(strings):  # functia de validare a datelor de intrare
    adancime_maxima = 0 # initializam adancimea maxima cu 0
    for sir in strings:
     adancime_curenta = 0 # initializam adancimea curenta cu 0
        if len(sir) > 254:
            raise ValueError
     file_out.write("Datele de intrare corespund restrictiilor impuse\n")


    for paranteza in sir: # parcurgem fiecare paranteza din sir
        if paranteza == '(': # daca paranteza este deschisa
            adancime_curenta += 1 # crestem adancimea curenta
            if adancime_curenta > adancime_maxima: # daca adancimea curenta este mai mare decat cea maxima
                adancime_maxima = adancime_curenta # actualizam adancimea maxima
        elif paranteza == ')': # daca paranteza este inchisa
            if adancime_curenta > 0: # daca exista o paranteza deschisa corespunzatoare
                adancime_curenta -= 1 # scadem adancimea curenta
            else:
                return -1 # sirul nu este corect parantezat


     if adancime_curenta != 0: # daca la sfarsitul sirului mai exista paranteze deschise
def adancime_parantezare(sir):  # functia de rezolvare
         return -1 # sirul nu este corect parantezat
    adancime_maxima = 0
    adancime_curenta = 0
     for paranteza in sir:
        if paranteza == '(':
            adancime_curenta += 1
            if adancime_curenta > adancime_maxima:
                adancime_maxima = adancime_curenta
         elif paranteza == ')':
            adancime_curenta -= 1
    return adancime_maxima


    return adancime_maxima # returnam adancimea maxima a parantezarii


sir = '()((()())())' # sirul de intrare
if __name__ == '__main__':
print(adancime_parantezare(sir)) # afisam rezultatul functiei
    file_in = open('paranteze2in.txt', 'r')
    file_out = open('paranteze2out.txt', 'w')


    try:
        n = int(file_in.readline().strip())
        siruri = [file_in.readline().strip() for _ in range(n)]
        validare(siruri)
        rezultate = [adancime_parantezare(sir) for sir in siruri]
        for rezultat in rezultate:
            file_out.write(str(rezultat) + '\n')
    except ValueError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")
    except IndexError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 22:05, 13 November 2023

Cerința[edit | edit source]

Se dă un șir de paranteze rotunde care se închid corect (corect parantezat). Să se determine adâncimea parantezării.

Pentru un șir de paranteze închise corect S, adâncimea parantezării, D(S) este definită astfel:

dacă șirul S este vid, D(S)=0 dacă S=(T), unde T este un șir de paranteze corect, D(S)=1+D(T) dacă S=AB, unde A și B sunt șiruri de paranteze corecte, D(S)=max{D(A),D(B)}

Date de intrare[edit | edit source]

Fișierul de intrare paranteze2in.txt conține pe prima un șir de paranteze rotunde, corect parantezat.

Date de ieșire[edit | edit source]

Fișierul de ieșire paranteze2out.txt va conține pe prima linie un număr M, reprezentând adâncimea parantezării.

Restricții și precizări[edit | edit source]

  • șirul va conține cel mult 254 de paranteze

Exemplul 1:[edit | edit source]

paranteze2in.txt

1
()((()())())

paranteze2out.txt


Datele de intrare corespund restrictiilor impuse.
3

Exemplul 2:[edit | edit source]

paranteze2in.txt

h

paranteze2out.txt

Datele de intrare nu corespund restrictiilor impuse.


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1" start="1">

def validare(strings): # functia de validare a datelor de intrare

   for sir in strings:
       if len(sir) > 254:
           raise ValueError
   file_out.write("Datele de intrare corespund restrictiilor impuse\n")


def adancime_parantezare(sir): # functia de rezolvare

   adancime_maxima = 0
   adancime_curenta = 0
   for paranteza in sir:
       if paranteza == '(':
           adancime_curenta += 1
           if adancime_curenta > adancime_maxima:
               adancime_maxima = adancime_curenta
       elif paranteza == ')':
           adancime_curenta -= 1
   return adancime_maxima


if __name__ == '__main__':

   file_in = open('paranteze2in.txt', 'r')
   file_out = open('paranteze2out.txt', 'w')
   try:
       n = int(file_in.readline().strip())
       siruri = [file_in.readline().strip() for _ in range(n)]
       validare(siruri)
       rezultate = [adancime_parantezare(sir) for sir in siruri]
       for rezultat in rezultate:
           file_out.write(str(rezultat) + '\n')
   except ValueError:
       file_out.write("Datele de intrare nu corespund restrictiilor impuse")
   except IndexError:
       file_out.write("Datele de intrare nu corespund restrictiilor impuse")

</syntaxhighlight>