0856 - Valori

From Bitnami MediaWiki
Revision as of 14:56, 26 December 2023 by AntalKrisztian (talk | contribs) (Pagină nouă: == Cerinţa == 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...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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>

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


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