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

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

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

Date de ieșire

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

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

Exemplul 1:

paranteze2in.txt

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

paranteze2out.txt


Datele de intrare corespund restrictiilor impuse.
3

Exemplul 2:

paranteze2in.txt

h

paranteze2out.txt

Datele de intrare nu corespund restrictiilor impuse.


Rezolvare

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