0301 - Frecventa1: Difference between revisions
Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/301/frecventa1 -Frecventa1] ---- == Cerinţa == Se dau '''n''' numere naturale cu cel mult două cifre fiecare. Afişaţi valorile distincte în ordinea descrescătoare a numărului de apariţii. == Date de intrare == Fișierul de intrare '''frecventa1.in''' conţine pe prima linie numărul '''n'''; urmează cele '''n''' numere, dispuse pe mai multe linii şi separate prin spaţii. == Date de ieșire == Dacă datele sunt introduse corec... |
No edit summary |
||
(2 intermediate revisions by the same user not shown) | |||
Line 41: | Line 41: | ||
def frecventa(vector): | def frecventa(vector): | ||
f = open(" | f = open("frecventa1.out", "w") | ||
aparitii = [(i, vector[i]) for i in range(100) if vector[i] > 0] | aparitii = [(i, vector[i]) for i in range(100) if vector[i] > 0] | ||
aparitii.sort(key=lambda x: x[1], reverse=True) | aparitii.sort(key=lambda x: x[1], reverse=True) | ||
Line 50: | Line 50: | ||
def conform_restrictiilor(): | def conform_restrictiilor(): | ||
vector = list() | vector = list() | ||
with open(' | with open('frecventa1.in') as f: | ||
lines = f.readlines() | lines = f.readlines() | ||
for line in lines: | for line in lines: | ||
Line 58: | Line 58: | ||
n = vector[0] | n = vector[0] | ||
vector_aparitii = [0] * 100 | vector_aparitii = [0] * 100 | ||
if | if n < 1 or n > 100000: | ||
print("Datele nu sunt comform restricțiilor impuse.") | print("Datele nu sunt comform restricțiilor impuse.") | ||
exit() | exit() | ||
Line 78: | Line 78: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==Explicaţie cod== | |||
Acest cod are ca scop determinarea frecvenței fiecărui element dintr-un vector de numere naturale citit din fișierul '''frecventa1.in''' și scrierea acestor frecvențe în ordine descrescătoare în fișierul '''frecventa1.out'''. | |||
Funcția '''conform_restrictiilor()''' se ocupă de citirea datelor din fișier, verificarea restricțiilor impuse (numărul de elemente din vector și valorile elementelor trebuie să se încadreze în anumite limite) și crearea unui nou vector '''vector_aparitii''' inițializat cu 0 pentru fiecare element posibil (de la 0 la 99, deoarece elementele vectorului trebuie să fie numere între 0 și 99). Dacă datele nu sunt conforme cu restricțiile impuse, programul se oprește cu ajutorul funcției '''exit()'''. Funcția returnează vectorul '''vector_aparitii''' cu frecvențele. | |||
Funcția '''frecventa(vector)''' primește ca parametru vectorul cu frecvențele obținut anterior și realizează sortarea acestor frecvențe în ordine descrescătoare prin crearea unei liste de tupluri '''(i, vector[i])''' pentru fiecare element '''i''' și frecvența sa '''vector[i]''', apoi sortarea acestei liste după a doua valoare din fiecare tuplu și scrierea în fișierul '''frecventa1.out''' a primului element din fiecare tuplu (adica a valorilor elementelor cu frecvență cea mai mare). | |||
În funcția principală, se citește numărul de elemente ale vectorului '''n''' și elementele vectorului vector cu ajutorul funcției '''input()''', apoi se apelează funcția '''conform_restrictiilor(vector)''' pentru a verifica dacă datele citite din fișier sunt valide. Dacă datele sunt conforme, se afișează mesajul "Datele sunt corecte." și se apelează funcția '''frecventa(vector)''' pentru a sorta și afișa frecvențele elementelor în ordine descrescătoare. |
Latest revision as of 14:08, 30 April 2023
Sursa: -Frecventa1
Cerinţa[edit | edit source]
Se dau n numere naturale cu cel mult două cifre fiecare. Afişaţi valorile distincte în ordinea descrescătoare a numărului de apariţii.
Date de intrare[edit | edit source]
Fișierul de intrare frecventa1.in conţine pe prima linie numărul n; urmează cele n numere, dispuse pe mai multe linii şi separate prin spaţii.
Date de ieșire[edit | edit source]
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt corecte.", iar apoi in fişierul de ieşire frecventa1.out va conţine pe prima linie valorile distincte dintre cele n, în ordinea descrescătoare a numărului de apariţii. În caz contrar, se va afișa pe ecran: "Datele nu sunt comform restricțiilor impuse.".
Restricţii şi precizări[edit | edit source]
- 1 ≤ n ≤ 100.000
- dacă două valori apar de acelaşi număr de ori, se va afişa mai întâi valoarea mai mică
Exemple[edit | edit source]
Exemplul 1[edit | edit source]
- frecventa1.in
- 8
- 3 19 3 65 3 19 14 3
- Ieșire
- Datele sunt corecte.
- frecventa1.out
- 3 19 14 65
Exemplul 2[edit | edit source]
- frecventa1.in
- 4
- 10 10 1 12
- Ieșire
- Datele sunt corecte.
- frecventa1.out
- 10 1 12
Exemplul 3[edit | edit source]
- frecventa1.in
- 5
- 22241 12 1234 12 236
- Ieșire
- Datele nu sunt comform restricțiilor impuse.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line>
- 0301 Frecventa1
def frecventa(vector):
f = open("frecventa1.out", "w") aparitii = [(i, vector[i]) for i in range(100) if vector[i] > 0] aparitii.sort(key=lambda x: x[1], reverse=True) for i in range(len(aparitii)): f.write(str(aparitii[i][0]) + " ")
def conform_restrictiilor():
vector = list() with open('frecventa1.in') as f: lines = f.readlines() for line in lines: for c in line.split(): if c.isdigit() is True: vector.append(int(c)) n = vector[0] vector_aparitii = [0] * 100 if n < 1 or n > 100000: print("Datele nu sunt comform restricțiilor impuse.") exit() vector = vector[1:] for x in vector: if x < 0 or x >= 100: print("Datele nu sunt comform restricțiilor impuse.") exit() vector_aparitii[x] += 1 print("Datele sunt corecte.") return vector_aparitii
if __name__ == '__main__':
vector = conform_restrictiilor() frecventa(vector)
</syntaxhighlight>
Explicaţie cod[edit | edit source]
Acest cod are ca scop determinarea frecvenței fiecărui element dintr-un vector de numere naturale citit din fișierul frecventa1.in și scrierea acestor frecvențe în ordine descrescătoare în fișierul frecventa1.out.
Funcția conform_restrictiilor() se ocupă de citirea datelor din fișier, verificarea restricțiilor impuse (numărul de elemente din vector și valorile elementelor trebuie să se încadreze în anumite limite) și crearea unui nou vector vector_aparitii inițializat cu 0 pentru fiecare element posibil (de la 0 la 99, deoarece elementele vectorului trebuie să fie numere între 0 și 99). Dacă datele nu sunt conforme cu restricțiile impuse, programul se oprește cu ajutorul funcției exit(). Funcția returnează vectorul vector_aparitii cu frecvențele.
Funcția frecventa(vector) primește ca parametru vectorul cu frecvențele obținut anterior și realizează sortarea acestor frecvențe în ordine descrescătoare prin crearea unei liste de tupluri (i, vector[i]) pentru fiecare element i și frecvența sa vector[i], apoi sortarea acestei liste după a doua valoare din fiecare tuplu și scrierea în fișierul frecventa1.out a primului element din fiecare tuplu (adica a valorilor elementelor cu frecvență cea mai mare).
În funcția principală, se citește numărul de elemente ale vectorului n și elementele vectorului vector cu ajutorul funcției input(), apoi se apelează funcția conform_restrictiilor(vector) pentru a verifica dacă datele citite din fișier sunt valide. Dacă datele sunt conforme, se afișează mesajul "Datele sunt corecte." și se apelează funcția frecventa(vector) pentru a sorta și afișa frecvențele elementelor în ordine descrescătoare.