4263 - ifelse

From Bitnami MediaWiki

Cerință[edit | edit source]

Studiind instrucțiunea if, Alinutza a aflat că ramura else se asociază celui mai apropiat if neasociat încă. Aprofundând studiul, a extras din fiecare program scris cuvintele if și else. Din neatenție a transcris greșit, pierzând asocierea corectă if else. Ajutați-o voi să aibă scrierea corectă, folosind un număr minim de modificări. O modificare înseamnă să înlocuim un cuvânt if cu else sau un cuvânt else cu if.

Date de intrare[edit | edit source]

Fisierul ifelsein.txt conține pe prima linie un număr natural n. Pe fiecare din următoarele n linii, se află câte un șir de caractere. Fiecare șir conține cuvinte if și else separate prin câte un spațiu, scrise cu litere mici.

Date de iesire[edit | edit source]

Fisierul ifelseout.txt va conține n valori reprezentând numărul minim de modificări efectuate astfel încât asocierea if else să fie corectă, sau -1 dacă nu este posibil pentru șirul de pe linia corespunzătoare.

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

  • în scrierea corectă fiecare if va avea asociat un else;
  • n este un număr natural mai mic sau egal cu 10;
  • fiecare linie poate avea cel mult 10000 de cuvinte if sau else separate prin cate un spațiu

Exemplu[edit | edit source]

ifelsein.txt

3

if else if if else if

if else if else

if else if

ifelseout.txt

1

0

-1

Explicație[edit | edit source]

Pentru primul caz va fi efectuată o singura modificare, ultimul if va fi transformat în else

În al doilea caz scrierea este corectă.

În al treilea caz nu se poate stabili o asociere corectă if else.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python"> def validare_șir(sir):

   stiva = []
   for cuvant in sir:
       if cuvant == "if":
           stiva.append("if")
       elif cuvant == "else":
           if not stiva:
               return False
           else:
               stiva.pop()
   return not stiva

def corect_associere(sir):

   if len(sir) > 10000:
       return -1
   if not validare_șir(sir):
       return -1
   stiva = []
   modificari = 0
   for cuvant in sir:
       if cuvant == "if":
           stiva.append("if")
       elif cuvant == "else":
           stiva.pop()
   return modificari

def main():

   with open("ifelsein.txt", "r") as input_file:
       n = int(input_file.readline().strip())
       if n > 10:
           print("Eroare: n trebuie să fie mai mic sau egal cu 10.")
           return
       siruri = [input_file.readline().split() for _ in range(n)]
   rezultate = [corect_associere(sir) for sir in siruri]
   with open("ifelseout.txt", "w") as output_file:
       output_file.write("\n".join(map(str, rezultate)))

if __name__ == "__main__":

   main()

</syntaxhighlight>