1580 - Schimb

De la Universitas MediaWiki

Cerinţa

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

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

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

Restricții și precizări

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

Exemplul 1

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


Exemplul 2

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


Exemplul 3

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


Rezolvare

# 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")


# Funcția schimb_sir schimbă a k-a literă din fiecare șir cu a p-a literă din alfabet sau scrie oglinditul șirului
# 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.")