3140 - A1z26

De la Universitas MediaWiki

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()