1580 - Schimb

From Bitnami MediaWiki

Cerinţa[edit | edit source]

Se dau trei numere naturale n, k și p și n șiruri formate din litere mici ale alfabetului englez. Înlocuiți a k-a literă din fiecare șir cu a p-a literă din alfabet. Dacă șirul are mai puțin de k litere se va scrie oglinditul lui.

Date de intrare[edit | edit source]

Pe prima linie a fișierului schimbin.txt se află trei numere naturale n, k și p. Pe următoarele n linii se află n șiruri.

Date de ieşire[edit | edit source]

În fișierul schimbout.txt se vor scrie noile șiruri, fiecare pe un rând nou.

Restricții și precizări[edit | edit source]

  • 1 ⩽ n, k ⩽ 10000
  • 1 ⩽ p ⩽ 26
  • șirurile au cel mult 500 de caractere

Exemplul 1[edit | edit source]

schimbin.txt
2 4 7
abcde
efg
schimbout.txt
Datele de intrare corespund restrictiilor impuse.
abcge
gfe


Exemplul 2[edit | edit source]

schimbin.txt
3 2 3
wqysd
s
sj
schimbout.txt
Datele de intrare corespund restrictiilor impuse.
wcysd
s
sc


Exemplul 3[edit | edit source]

schimbin.txt
2 4 999599995
schimbout.txt
Datele de intrare nu corespund restrictiilor impuse.


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. Funcția de validare verifică dacă datele de intrare sunt în intervalul specificat

def validare(n_validare, k_validare, p_validare, siruri_validare):

   # Verificăm dacă n, k și p sunt în intervalul specificat
   if (n_validare <= 0 or n_validare > 10000 or
           k_validare <= 0 or k_validare > 10000 or p_validare <= 0 or p_validare > 26):
       raise ValueError  # Ridicăm o eroare dacă n, k sau p nu sunt în intervalul specificat
   for sir_validare in siruri_validare:    # Parcurgem lista de șiruri
       # Verificăm dacă lungimea șirului este mai mică decât 500
       if len(sir_validare) > 500:
           raise ValueError
   file_out.write("Datele de intrare corespund restrictiilor impuse.\n")


  1. Funcția schimb_sir schimbă a k-a literă din fiecare șir cu a p-a literă din alfabet sau scrie oglinditul șirului
  2. dacă șirul are mai puțin de k litere

def schimb_sir(k_schimb, p_schimb, siruri_schimb):

   # Definim alfabetul
   alfabet = 'abcdefghijklmnopqrstuvwxyz'
   # Parcurgem lista de șiruri
   for i in range(len(siruri_schimb)):
       # Verificăm dacă șirul are mai puțin de k litere
       if len(siruri_schimb[i]) < k_schimb:
           # Scriem oglinditul șirului
           siruri_schimb[i] = siruri_schimb[i][::-1]
       else:
           # Înlocuim a k-a literă din șir cu a p-a literă din alfabet
           siruri_schimb[i] = siruri_schimb[i][:k_schimb-1] + alfabet[p_schimb-1] + siruri_schimb[i][k_schimb:]
   return siruri_schimb


if __name__ == '__main__':

   file_in = open("schimbin.txt", "r")
   file_out = open("schimbout.txt", "w")
   try:
       # Citim numărul de șiruri, k și p
       n_main, k_main, p_main = map(int, file_in.readline().split())
       # Citim șirurile
       siruri_main = [file_in.readline().strip() for _ in range(n_main)]
       # Validăm datele de intrare
       validare(n_main, k_main, p_main, siruri_main)
       # Schimbăm șirurile
       siruri_schimbate = schimb_sir(k_main, p_main, siruri_main)
       # Scriem șirurile schimbate în fișierul de ieșire
       for sir in siruri_schimbate:
           file_out.write(sir + '\n')
   # Dacă datele de intrare nu sunt valide, afișăm un mesaj de eroare
   except ValueError:
       file_out.write("Datele de intrare nu corespund restrictiilor impuse.")
   # Dacă datele de intrare sunt incomplete, afișăm un mesaj de eroare
   except IndexError:
       file_out.write("Datele de intrare nu corespund restrictiilor impuse.")


</syntaxhighlight>