3140 - A1z26

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

A1Z26

Cifrul A1Z26 este cel mai ușor cifru de substituție: fiecare literă este înlocuită cu numărul ei de ordine în 
alfabet. Astfel, A devine 1, B devine 2, ș.a.m.d.

Cerinţa

Se dă un număr p:
1. Dacă p = 1, se dă un șir de caractere s format din litere mari. Să se afișeze numărul de ordine 
al caracterelor separate printr-un spațiu.
2. Dacă p = 2, se dă un număr n și n numere cuprinse între 1 și 26. Să se afișeze 
șirul corespunzător numerelor.

Date de intrare

Fișierul de intrare a1z26in.txt conține pe prima linie numărul p.
Dacă p = 1, pe a doua linie din fișier se află șirul de caractere s.
Dacă p = 2, pe a doua linie din fișier se află numarul natural n iar pe următoarea linie se află n numere.

Date de ieșire

Dacă p = 1, fișierul de ieșire a1z26out.txt va conține pe prima linie numerele de ordine ale caracterelor din șirul s, separate prin câte un spațiu. Daca p = 2, fișierul de ieșire a1z26out.txt va conține pe prima linie șirul format din numerele de ordine date, afișate cu litere mari.

Restricţii şi precizări

  • 1 ⩽ p ⩽ 2
  • 1 ⩽ lungimea șirului s ⩽ 1.000.000
  • 1 ⩽ n ⩽ 1.000.000
  • 1 ⩽ numerele de pe a doua linie ⩽ 26

Exemplu 1

a1z26in.txt
1
ANAAREMERE
a1z26out.txt
Datele de intrare corespund restrictiilor impuse
1 14 1 1 18 5 13 5 18 5


Exemplu 2

a1z26in.txt
2
10
1 14 1 1 18 5 13 5 18 5
a1z26out.txt
Datele de intrare corespund restrictiilor impuse
ANAAREMERE

Exemplu 3

a1z26in.txt
1
anaaremere
a1z26out.txt
Datele de intrare nu corespund restrictiilor impuse


Rezolvare

def cifrare(s):
    # Transformă fiecare literă în numărul ei de ordine în alfabet
    return ' '.join([str(ord(c) - ord('A') + 1) for c in s])


def decifrare(numere):
    # Transformă fiecare număr în litera sa corespunzătoare în alfabet
    return ''.join([chr(numar + ord('A') - 1) for numar in numere])


def main():
    with open('a1z26in.txt', 'r') as fin, open('a1z26out.txt', 'w') as fout:
        p = int(fin.readline().strip())

        # Verifică dacă datele de intrare respectă restricțiile
        if p == 1:
            s = fin.readline().strip()
            if len(s) > 1000000 or not s.isupper():
                fout.write("Datele de intrare nu corespund restrictiilor impuse\n")
                return
            fout.write("Datele de intrare corespund restrictiilor impuse\n")
            fout.write(cifrare(s) + '\n')
        elif p == 2:
            n = int(fin.readline().strip())
            numere = list(map(int, fin.readline().strip().split()))
            if n > 1000000 or not all(1 <= numar <= 26 for numar in numere):
                fout.write("Datele de intrare nu corespund restrictiilor impuse\n")
                return
            fout.write("Datele de intrare corespund restrictiilor impuse\n")
            fout.write(decifrare(numere) + '\n')


if __name__ == "__main__":
    main()