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