4263 - ifelse: Difference between revisions
Andrada378 (talk | contribs) Pagină nouă: <u>''Cerință''</u> 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. ''<u>Date de intr... |
Andrada378 (talk | contribs) No edit summary |
||
Line 1: | Line 1: | ||
== Cerință == | |||
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. | 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 == | |||
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. | |||
Fisierul | |||
n este | == Date de iesire == | ||
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 == | |||
* î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 == | |||
'''ifelsein.txt''' | |||
3 | 3 | ||
Line 31: | Line 25: | ||
if else if | if else if | ||
'''ifelseout.txt''' | |||
1 | 1 | ||
Line 39: | Line 33: | ||
-1 | -1 | ||
== Explicație == | |||
Pentru primul caz va fi efectuată o singura modificare, ultimul if va fi transformat în else | Pentru primul caz va fi efectuată o singura modificare, ultimul if va fi transformat în else | ||
Line 47: | Line 40: | ||
În al treilea caz nu se poate stabili o asociere corectă if else. | În al treilea caz nu se poate stabili o asociere corectă if else. | ||
== Rezolvare == | |||
<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): | 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(): | 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__": | if __name__ == "__main__": | ||
main() | |||
</syntaxhighlight> | |||
Latest revision as of 14:48, 5 January 2024
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>