1754 - Munți: Difference between revisions

From Bitnami MediaWiki
Dragos1234 (talk | contribs)
Dragos1234 (talk | contribs)
 
(21 intermediate revisions by 2 users not shown)
Line 1: Line 1:
Sursa: [https://www.pbinfo.ro/probleme/1754/munti]
Sursa: [https://www.pbinfo.ro/probleme/1754/munti]
== Cerinţa ==
== Cerinţa ==
Se dă un număr natural '''n'''. Dacă numărul este norocos afișați cele '''n''' numere consecutive care adunate dau pătratul acestuia.
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 ==
== Date de intrare ==
Programul citește de la tastatură numărul '''n'''.
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 ==  
== Date de ieșire ==  
Daca '''n''' este norocos, programul va afișa pe ecran cele '''n''' numere consecutive care adunate dau '''n * n''', separate prin spații. In caz contrar, programul va afișa mesajul '''NU ESTE NOROCOS'''.
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 ==
== Restricţii şi precizări ==
* 1 ⩽ '''n''' ⩽ 1000
* 1 ⩽ '''N''' ⩽ 1.000.000
* 1 ⩽ '''înalțimea inițială''' ⩽ 1.000.000.000


== Exemplul 1 ==
== Exemplul 1 ==
; Intrare
; Intrare
: 7
: ''munti.in''
: 4
: 2 6 2 2
; Ieșire
; Ieșire
: 4 5 6 7 8 9 10
: Datele introduse corespund cerintelor.
: ''munti.out''
: 4
<br>
<br>


== Exemplul 2 ==
== Exemplul 2 ==
; Intrare
; Intrare
: ''munti.in''
: 8
: 8
: 2 6 2 2
; Ieșire
; Ieșire
: NU ESTE NOROCOS
: Datele introduse corespund cerintelor.
<br>
: ''munti.out''
: 7


== Rezolvare ==  
== Rezolvare ==  
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
#1892
#1754
def validate_n(n):
def validate_input(n, x_list):
     if isinstance(n, int) and 1 <= n <= 1000:
     if not 1 <= n <= 1000000 or not all(1 <= x <= 1000000000 for x in x_list):
         return True
         print("Datele introduse nu corespund cerintelor.")
     else:
        exit()
         return False
 
 
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




def main():
if __name__ == "__main__":
    n = int(input("n: "))
     input_file = "munti.in"
     if not validate_n(n):
     output_file = "munti.out"
        print("Numărul introdus trebuie să fie între 1 și 1000.")
        return
     if n % 2 == 1:
        k = (n+1)//2
        while n > 0:
            print(k, end=' ')
            k += 1
            n -= 1
    else:
        print("NU ESTE NOROCOS")


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


main()


</syntaxhighlight>
</syntaxhighlight>


== Explicatie rezolvare ==
== Explicatie rezolvare ==
Acest program validează inputul pentru o problemă specifică și apoi calculează un rezultat pe baza inputului.
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.
În ceea ce privește validarea inputului, funcția validate_input primește doi parametri: '''n''' și '''x_list'''.  
 
n reprezintă numărul de înălțimi de verificat, iar '''x_list''' este o listă de înălțimi inițiale.
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.
În cazul în care '''n''' este mai mic decât '''1''' sau mai mare decât '''1.000.000''' sau oricare dintre înălțimi este mai mică decât '''1''' sau mai mare decât '''1.000.000.000''', funcția afișează un mesaj de eroare și apoi iese din program.
 
Funcția main deschide două fișiere, "munti.in" și "munti.out", citind din fișierul de intrare '''munti.in''' valoarea lui '''n''' și lista de înălțimi '''x_list'''.  
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.
Apoi, apelând funcția validate_input, se verifică validitatea inputului.  
 
Dacă suma tuturor înălțimilor din listă este divizibilă cu '''n''', se afișează '''n''' în fișierul de ieșire '''munti.out'''.
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.
În caz contrar, se afișează '''n-1'''.
 
În general, acest program se ocupă de o problemă specifică care implică validarea inputului și apoi efectuarea unor calcule pe baza acelui input.
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.

Latest revision as of 21:30, 14 May 2023

Sursa: [1]

Cerinţa[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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

Exemplul 1[edit | edit source]

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


Exemplul 2[edit | edit source]

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

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 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))


</syntaxhighlight>

Explicatie rezolvare[edit | edit source]

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.