3140 - A1z26

From Bitnami MediaWiki

A1Z26[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

  • 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[edit | edit source]

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


Exemplu 2[edit | edit source]

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[edit | edit source]

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


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> 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()

</syntaxhighlight>