1504 - Comori 1: Diferență între versiuni

De la Universitas MediaWiki
(Pagină nouă: Diriginta clasei a V-a organizează cu cei n elevi ai clasei sale concursul „Căutătorii de comori”. În concurs, fiecare elev trebuie să treacă prin n puncte de control și să răspundă la o întrebare la care primește un punctaj cuprins între 0 și 100. Mihai, elev în clasa a V-a, participă cu mare plăcere la concurs și își notează punctajele obținute la fiecare punct de control. ==Cerința== Să se specifice numerele de ordine ale punctelor de control l...)
 
Fără descriere a modificării
 
(Nu s-au afișat 2 versiuni intermediare efectuate de același utilizator)
Linia 11: Linia 11:


==Date de ieșire==
==Date de ieșire==
Fișierul de ieșire comori1.out va conține numerele de ordine ale punctele de control la care Mihai a obținut un punctaj mai mic decât cel obținut la punctul de control anterior sau valoarea 0 dacă punctajele obținute de Mihai au fost în ordine crescătoare.
Dacă datele sunt introduse corect, pe ecran se va afișa: '''"Date de intrare valide."''', apoi fișierul de ieșire comori1.out va conține numerele de ordine ale punctele de control la care Mihai a obținut un punctaj mai mic decât cel obținut la punctul de control anterior sau valoarea 0 dacă punctajele obținute de Mihai au fost în ordine crescătoare. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: '''"Date de intrare invalide".'''


==Restricții și precizări==
==Restricții și precizări==
Linia 20: Linia 20:
comori1.in
comori1.in


6  
: 6  
50 60 65 70 70 80
: 50 60 65 70 70 80


comori1.out
comori1.out
 
: Date de intrare valide
0
: 0


==Explicație==
==Explicație==
Linia 47: Linia 47:
==Rezolvare==
==Rezolvare==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
def validate_input(n, scores):
def validare(n, nums):
     if n < 1 or n > 1000:
     if not (1 <= n <= 1_000):
        print("Invalid input: n should be between 1 and 1000")
         return False
         exit()
     if not all(0 <= nums <= 100 for nums in nums):
     if len(scores) != n:
         return False
        print("Invalid input: number of scores doesn't match n")
    return True
        exit()
    for score in scores:
         if score < 0 or score > 100:
            print("Invalid input: scores should be between 0 and 100")
            exit()


def read_input(file_name):
    with open(file_name, 'r') as f:
        n = int(f.readline())
        scores = list(map(int, f.readline().split()))
        validate_input(n, scores)
        return n, scores


def main():
def comori(n, a):
    n, scores = read_input("comori1.in")
     cnt = 0
     prev_score = scores[0]
     for i in range(n-1):
    output = []
         if a[i] > a[i+1]:
     for i in range(1, n):
             cnt += 1
         if scores[i] < prev_score:
            fout.write(f"{i+2} ")
             output.append(str(i+1))
     if cnt == 0:
        prev_score = scores[i]
         fout.write("0 ")
     if len(output) == 0:
         output.append("0")
    with open("comori1.out", 'w') as f:
        f.write(" ".join(output))


main()
</syntaxhighlight>


==Explicatie==
if __name__ == '__main__':
Funcția validate_input verifică dacă datele de intrare sunt valide și oprește execuția programului dacă nu sunt.
    fin = open("comori1.in")
    fout = open("comori1.out", "w")


Funcția read_input deschide fișierul de intrare, citeste numărul de puncte de control și lista de punctaje, apoi verifică datele folosind funcția validate_input. Dacă datele sunt valide, aceasta le returnează.
    n = int(fin.readline().strip())
    nums = list(map(int, fin.readline().split()))
    if validare(n, nums):
        print("Date de intrare valide")
        comori(n, nums)
    else:
        print("Date de intrare invalide")


Funcția main apelează funcția read_input, apoi parcurge lista de punctaje și verifică fiecare punctaj în parte pentru a determina dacă a fost mai mic decât cel anterior. Dacă a fost mai mic, adaugă numărul de ordine al punctului de control respectiv în lista output. Dacă toate punctajele sunt
    fin.close()
    fout.close()
</syntaxhighlight>
==Explicatie cod:==
Funcția validare(n, nums) primește doi parametri: n de tip întreg și nums o listă de numere întregi. Funcția verifică dacă n se află în intervalul [1, 1000] și dacă toate valorile din lista nums sunt în intervalul [0, 100]. Dacă toate aceste condiții sunt îndeplinite, funcția returnează True, altfel returnează False.
Funcția comori(n, a) primește doi parametri: n de tip întreg și a o listă de numere întregi. Funcția parcurge lista a și numără de câte ori un element este mai mare decât elementul următor. Dacă se găsește o astfel de situație, se incrementează un contor cnt și se scrie în fișierul de ieșire indexul elementului următor. Dacă cnt rămâne 0, înseamnă că nu s-au găsit astfel de situații și se scrie "0" în fișierul de ieșire.
În blocul if __name__ == '__main__':, se deschid fișierele de intrare și de ieșire. Se citește n de la intrarea din fișier și se inițializează lista nums cu valorile citite. Se validează datele de intrare utilizând funcția validare(n, nums). Dacă datele de intrare sunt valide, se afișează un mesaj de confirmare, se apelează funcția comori(n, nums) și se scriu rezultatele în fișierul de ieșire. Altfel, se afișează un mesaj de eroare.
Codul primește datele de intrare din fișier, validează datele și efectuează operațiile specifice pentru a determina și afișa rezultatele în fișierul de ieșire.

Versiunea curentă din 29 iunie 2023 19:06

Diriginta clasei a V-a organizează cu cei n elevi ai clasei sale concursul „Căutătorii de comori”. În concurs, fiecare elev trebuie să treacă prin n puncte de control și să răspundă la o întrebare la care primește un punctaj cuprins între 0 și 100. Mihai, elev în clasa a V-a, participă cu mare plăcere la concurs și își notează punctajele obținute la fiecare punct de control.

Cerința

Să se specifice numerele de ordine ale punctelor de control la care Mihai a obținut un punctaj mai mic decât cel obținut la punctul de control anterior. Dacă punctajele obținute de Mihai au fost în ordine crescătoare, se va afișa valoarea 0.

Date de intrare

Fișierul de intrare comori1.in conține: pe prima linie, un număr natural n reprezentând numărul punctelor de control, pe a doua linie, un șir format din n numere naturale reprezentând punctajele lui Mihai la fiecare punct de control, separate prin câte un spațiu.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Date de intrare valide.", apoi fișierul de ieșire comori1.out va conține numerele de ordine ale punctele de control la care Mihai a obținut un punctaj mai mic decât cel obținut la punctul de control anterior sau valoarea 0 dacă punctajele obținute de Mihai au fost în ordine crescătoare. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: "Date de intrare invalide".

Restricții și precizări

1 ≤ n ≤ 1000 Numerele din şir nu depăşesc 100.

Exemplul 1

comori1.in

6
50 60 65 70 70 80

comori1.out

Date de intrare valide
0

Explicație

Mihai realizează la cele 6 puncte de control punctajele 50 ≤ 60 ≤ 65 ≤ 70 ≤ 70 ≤ 80 Pentru că punctajele au fost în ordine crescătoare afișăm 0.

Exemplul 2

comori1.in 9 66 70 20 35 50 34 69 80 12

comori1.out 3 6 9

Explicație

La punctul de control 3 Mihai are punctajul 20 ≤ 70; La punctul de control 6 Mihai are punctajul 34 ≤ 50; La punctul de control 9 Mihai are punctajul 12 ≤ 80.

Rezolvare

def validare(n, nums):
    if not (1 <= n <= 1_000):
        return False
    if not all(0 <= nums <= 100 for nums in nums):
        return False
    return True


def comori(n, a):
    cnt = 0
    for i in range(n-1):
        if a[i] > a[i+1]:
            cnt += 1
            fout.write(f"{i+2} ")
    if cnt == 0:
        fout.write("0 ")


if __name__ == '__main__':
    fin = open("comori1.in")
    fout = open("comori1.out", "w")

    n = int(fin.readline().strip())
    nums = list(map(int, fin.readline().split()))
    if validare(n, nums):
        print("Date de intrare valide")
        comori(n, nums)
    else:
        print("Date de intrare invalide")

    fin.close()
    fout.close()

Explicatie cod:

Funcția validare(n, nums) primește doi parametri: n de tip întreg și nums o listă de numere întregi. Funcția verifică dacă n se află în intervalul [1, 1000] și dacă toate valorile din lista nums sunt în intervalul [0, 100]. Dacă toate aceste condiții sunt îndeplinite, funcția returnează True, altfel returnează False. Funcția comori(n, a) primește doi parametri: n de tip întreg și a o listă de numere întregi. Funcția parcurge lista a și numără de câte ori un element este mai mare decât elementul următor. Dacă se găsește o astfel de situație, se incrementează un contor cnt și se scrie în fișierul de ieșire indexul elementului următor. Dacă cnt rămâne 0, înseamnă că nu s-au găsit astfel de situații și se scrie "0" în fișierul de ieșire. În blocul if __name__ == '__main__':, se deschid fișierele de intrare și de ieșire. Se citește n de la intrarea din fișier și se inițializează lista nums cu valorile citite. Se validează datele de intrare utilizând funcția validare(n, nums). Dacă datele de intrare sunt valide, se afișează un mesaj de confirmare, se apelează funcția comori(n, nums) și se scriu rezultatele în fișierul de ieșire. Altfel, se afișează un mesaj de eroare. Codul primește datele de intrare din fișier, validează datele și efectuează operațiile specifice pentru a determina și afișa rezultatele în fișierul de ieșire.