0856 - Valori
Cerinţa[edit | edit source]
Gigel se joacă cu cuvinte (scrise cu litere din alfabetul englez, mari sau mici). El a asociat fiecărei litere din alfabet o valoare număr natural, pe care a numit-o valoarea literei. Apoi a definit valoarea unui cuvânt astfel: se calculează suma S1 a valorilor literelor mici din cuvânt şi suma S2 a valorilor literelor mari din cuvânt. Valoarea cuvântului va fi S1 - S2.
Cunoscându-se valoarea fiecărei litere din alfabet şi o listă de cuvinte, să se determine cuvântul cu valoarea maximă. Dacă există mai multe cuvinte de valoare maximă, se vor determina toate, în ordinea din lista dată.
Date de intrare[edit | edit source]
Fișierul de intrare valoriin.txt conține pe prima linie numărul 26 de numere, reprezentând, în ordine, valorile literelor din alfabet, pe a doua linie numărul de cuvinte n iar pe următoarele n linii câte un cuvânt format din litere mari şi mici ale alfabetului englez.
Date de ieşire[edit | edit source]
Fișierul de ieșire valoriout.txt va conține cuvintele de valoare maximă din lista dată, în ordinea din listă, fiecare cuvânt pe câte o linie.
Restricții și precizări[edit | edit source]
- valorile literelor sunt numere naturale mai mici decât 1000
- 1 ⩽ n ⩽ 1000
- fiecare dintre cuvintele date conţine cel mult 255 caractere
Exemplul 1[edit | edit source]
- valoriin.txt
2 7 7 3 9 8 9 6 3 9 6 6 6 5 5 8 2 6 6 1 5 6 9 4 7 3 4 BaciL AbAc Aba AbEcEdAr
- valoriout.txt
Datele de intrare corespund restrictiilor impuse. AbAc
Observaţie[edit | edit source]
Valoarea unui cuvânt poate fi negativă. De exemplu, valoarea cuvântului BaciL este (2+7+3)-(7+6)=-1
Exemplul 2[edit | edit source]
- valoriin.txt
4 6 7 8 fdfdfdf
- valoriout.txt
Datele de intrare nu corespund restrictiilor impuse.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line>
- functia de validare verifica daca datele de intrare sunt in intervalul specificat
def validare(n_validare, cuvinte_validare):
# verificam daca n este in intervalul 1-1000 if not (1 <= n_validare <= 1000): raise ValueError # ridicam o eroare daca n nu este in intervalul 1-1000 for cuvant in cuvinte_validare: # parcurgem lista de cuvinte # verificam daca lungimea cuvantului este mai mica sau egala cu 255 if len(cuvant) > 255: raise ValueError file_out.write("Datele de intrare corespund restrictiilor impuse.\n")
- functia valoare_cuvant calculeaza valoarea unui cuvant
def valoare_cuvant(cuvant, valori_litere):
# calculam suma valorilor literelor mici si mari din cuvant s1 = sum(valori_litere[ord(litera) - ord('a')] for litera in cuvant if litera.islower()) s2 = sum(valori_litere[ord(litera) - ord('A')] for litera in cuvant if litera.isupper()) # returnam diferenta dintre sumele calculate return s1 - s2
if __name__ == '__main__':
file_in = open("valoriin.txt", "r") file_out = open("valoriout.txt", "w")
try: # citim valorile literelor valori_litere_main = list(map(int, file_in.readline().split())) # citim numarul de cuvinte n_main = int(file_in.readline()) # citim cuvintele cuvinte_main = [file_in.readline().strip() for _ in range(n_main)] # validam datele de intrare validare(n_main, cuvinte_main) # calculam valorile cuvintelor valori_cuvinte = [valoare_cuvant(cuvant, valori_litere_main) for cuvant in cuvinte_main] # determinam valoarea maxima valoare_max = max(valori_cuvinte) # scriem cuvintele de valoare maxima in fisierul de iesire for i in range(n_main): if valori_cuvinte[i] == valoare_max: file_out.write(cuvinte_main[i] + '\n')
# daca datele de intrare nu sunt valide, afisam un mesaj de eroare except ValueError: file_out.write("Datele de intrare nu corespund restrictiilor impuse.") # daca datele de intrare sunt incomplete, afisam un mesaj de eroare except IndexError: file_out.write("Datele de intrare nu corespund restrictiilor impuse.")
</syntaxhighlight>