1754 - Munți: Diferență între versiuni

De la Universitas MediaWiki
 
(Nu s-au afișat 2 versiuni intermediare efectuate de alți 2 utilizatori)
Linia 38: Linia 38:
#1754
#1754
def validate_input(n, x_list):
def validate_input(n, x_list):
    print("Datele de intrare sunt valide.")
     if not 1 <= n <= 1000000 or not all(1 <= x <= 1000000000 for x in x_list):
     if not 1 <= n <= 1000000:
        print("Datele introduse nu corespund cerintelor.")
        exit()
    if not all(1 <= x <= 1000000000 for x in x_list):
         print("Datele introduse nu corespund cerintelor.")
         print("Datele introduse nu corespund cerintelor.")
         exit()
         exit()




if __name__ == "__main__":
def read_input_file(file_path):
     with open("munti.in", "r") as f_in, open("munti.out", "w") as f_out:
     with open(file_path, "r") as f_in:
         n = int(f_in.readline())
         n = int(f_in.readline())
         x_list = list(map(int, f_in.readline().split()))
         x_list = list(map(int, f_in.readline().split()))
    return n, x_list
def write_output_file(file_path, result):
    with open(file_path, "w") as f_out:
        f_out.write(str(result))
def calculate_result(n, x_list):
    s = sum(x_list)
    return n if s % n == 0 else n - 1
if __name__ == "__main__":
    input_file = "munti.in"
    output_file = "munti.out"
    try:
        n, x_list = read_input_file(input_file)
         validate_input(n, x_list)
         validate_input(n, x_list)
         s = sum(x_list)
         result = calculate_result(n, x_list)
         if s % n == 0:
         write_output_file(output_file, result)
            f_out.write(str(n))
        print("Datele introduse corespund cerintelor.")
         else:
    except ValueError as e:
            f_out.write(str(n - 1))
        print(str(e))
    except FileNotFoundError:
         print("Fisierul de intrare nu exista.")
    except Exception as e:
        print("A aparut o eroare: " + str(e))
 


</syntaxhighlight>
</syntaxhighlight>


== Explicatie rezolvare ==
== Explicatie rezolvare ==
Acest program este o soluție pentru o problemă de programare care citește date de intrare dintr-un fișier numit "munti.in", verifică dacă aceste date îndeplinesc anumite cerințe și apoi calculează un rezultat bazat pe datele de intrare și îl scrie într-un fișier numit "munti.out".
Acest program are ca scop citirea unui fișier de intrare, validarea datelor, efectuarea unui calcul și scrierea rezultatului într-un fișier de ieșire.
 
Funcția `validate_input` primește doi parametri: `n` și `x_list`. Această funcție verifică dacă `n` este între 1 și 1.000.000 și dacă toate elementele din `x_list` sunt între 1 și 1.000.000.000. Dacă această validare nu este îndeplinită, se afișează un mesaj de eroare și programul se încheie.
 
Funcția `read_input_file` primește calea către un fișier de intrare și returnează două valori: `n` și `x_list`. Ea deschide fișierul de intrare și citește prima linie, care reprezintă `n`. Apoi citește a doua linie și o împarte în elemente întregi, pe care le stochează într-o listă `x_list`. Cele două valori sunt returnate ca rezultat.
 
Funcția `write_output_file` primește calea către un fișier de ieșire și un rezultat. Ea deschide fișierul de ieșire și scrie rezultatul convertit la șir de caractere.


Funcția "validate_input" verifică dacă numărul "n" și lista "x_list" de numere întregi citite din fișierul de intrare îndeplinesc cerințele problemei. Dacă datele nu îndeplinesc cerințele, programul afișează un mesaj de eroare și se încheie prin apelul funcției "exit()".
Funcția `calculate_result` primește `n` și `x_list` și efectuează un calcul pentru a obține rezultatul. Calculează suma tuturor elementelor din `x_list` și verifică dacă această sumă este divizibilă cu `n`. Dacă este, rezultatul este egal cu `n`, altfel rezultatul este egal cu `n - 1`. Rezultatul calculat este returnat.


După validarea datelor de intrare, programul calculează suma numerelor din lista "x_list" și determină dacă această sumă este divizibilă cu "n" sau nu. Dacă suma este divizibilă cu "n", atunci programul scrie în fișierul de ieșire numărul "n", altfel scrie "n - 1".
În cadrul blocului `if __name__ == "__main__":`, se specifică fișierul de intrare și fișierul de ieșire. Se încearcă citirea datelor din fișierul de intrare folosind `read_input_file`, validarea datelor cu `validate_input`, calcularea rezultatului cu `calculate_result`, scrierea rezultatului în fișierul de ieșire folosind `write_output_file`, și se afișează un mesaj de confirmare dacă totul a fost realizat cu succes.


În esență, acest program încearcă să găsească numărul de munți (sau vârfuri) care pot fi formați prin gruparea unui anumit număr de înălțimi ale munților citite din fișierul de intrare.
Dacă apar excepții în timpul execuției (cum ar fi valori invalide în fișierul de intrare sau fișierul de intrare lipsă), se afișează un mesaj corespunzător.

Versiunea curentă din 14 mai 2023 21:30

Sursa: [1]

Cerinţa

Vrăjitorul vă cere să determinați numărul maxim de munți ce pot fi aduși la o înălțime egală.

Date de intrare

Pe prima linie a fișierului munti.in se va afla numărul natural N, reprezentând numărul de munți existenți. Pe cea de-a doua linie se vor afla N valori naturale separate prin spațiu, reprezentând înălțimea inițială a fiecărui munte.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele introduse corespund cerintelor.", apoi fișierul de ieșire munti.out va conține, pe prima și singura linie a fișierului, numărul maxim de munți ce pot fi aduși la o înălțime egală. În cazul în care datele nu respectă restricțiile, se va doar afișa pe ecran: "Datele introduse nu corespund cerintelor."

Restricţii şi precizări

  • 1 ⩽ N ⩽ 1.000.000
  • 1 ⩽ înalțimea inițială ⩽ 1.000.000.000

Exemplul 1

Intrare
munti.in
4
2 6 2 2
Ieșire
Datele introduse corespund cerintelor.
munti.out
4


Exemplul 2

Intrare
munti.in
8
2 6 2 2
Ieșire
Datele introduse corespund cerintelor.
munti.out
7

Rezolvare

#1754
def validate_input(n, x_list):
    if not 1 <= n <= 1000000 or not all(1 <= x <= 1000000000 for x in x_list):
        print("Datele introduse nu corespund cerintelor.")
        exit()


def read_input_file(file_path):
    with open(file_path, "r") as f_in:
        n = int(f_in.readline())
        x_list = list(map(int, f_in.readline().split()))
    return n, x_list


def write_output_file(file_path, result):
    with open(file_path, "w") as f_out:
        f_out.write(str(result))


def calculate_result(n, x_list):
    s = sum(x_list)
    return n if s % n == 0 else n - 1


if __name__ == "__main__":
    input_file = "munti.in"
    output_file = "munti.out"

    try:
        n, x_list = read_input_file(input_file)
        validate_input(n, x_list)
        result = calculate_result(n, x_list)
        write_output_file(output_file, result)
        print("Datele introduse corespund cerintelor.")
    except ValueError as e:
        print(str(e))
    except FileNotFoundError:
        print("Fisierul de intrare nu exista.")
    except Exception as e:
        print("A aparut o eroare: " + str(e))

Explicatie rezolvare

Acest program are ca scop citirea unui fișier de intrare, validarea datelor, efectuarea unui calcul și scrierea rezultatului într-un fișier de ieșire.

Funcția `validate_input` primește doi parametri: `n` și `x_list`. Această funcție verifică dacă `n` este între 1 și 1.000.000 și dacă toate elementele din `x_list` sunt între 1 și 1.000.000.000. Dacă această validare nu este îndeplinită, se afișează un mesaj de eroare și programul se încheie.

Funcția `read_input_file` primește calea către un fișier de intrare și returnează două valori: `n` și `x_list`. Ea deschide fișierul de intrare și citește prima linie, care reprezintă `n`. Apoi citește a doua linie și o împarte în elemente întregi, pe care le stochează într-o listă `x_list`. Cele două valori sunt returnate ca rezultat.

Funcția `write_output_file` primește calea către un fișier de ieșire și un rezultat. Ea deschide fișierul de ieșire și scrie rezultatul convertit la șir de caractere.

Funcția `calculate_result` primește `n` și `x_list` și efectuează un calcul pentru a obține rezultatul. Calculează suma tuturor elementelor din `x_list` și verifică dacă această sumă este divizibilă cu `n`. Dacă este, rezultatul este egal cu `n`, altfel rezultatul este egal cu `n - 1`. Rezultatul calculat este returnat.

În cadrul blocului `if __name__ == "__main__":`, se specifică fișierul de intrare și fișierul de ieșire. Se încearcă citirea datelor din fișierul de intrare folosind `read_input_file`, validarea datelor cu `validate_input`, calcularea rezultatului cu `calculate_result`, scrierea rezultatului în fișierul de ieșire folosind `write_output_file`, și se afișează un mesaj de confirmare dacă totul a fost realizat cu succes.

Dacă apar excepții în timpul execuției (cum ar fi valori invalide în fișierul de intrare sau fișierul de intrare lipsă), se afișează un mesaj corespunzător.