3856 - Scytale

From Bitnami MediaWiki

Scytale[edit | edit source]

Cifrul Scytale functioneaza asa: se da un mesaj cu n litere si un numar m; mesajul trebuie asezat intr-o matrice cu m linii si n coloane; pentru mesajul WEAREDISCOVEREDFLEEATONCE cu 25 de litere si numarul m=3, mesajul va fi pozitionat in matrice asa:

W . . E . . A . . R . . E . . D . . I . . S . . C

. O . . V . . E . . R . . E . . D . . F . . L . .

. . E . . E . . A . . T . . O . . N . . C . . E .

Cerința[edit | edit source]

Dandu-se un numar c, mesajul si numarul m:

  • pentru c=1, sa se afiseze mesajul criptat
  • pentru c=2, sa se afiseze mesajul decriptat

Date de intrare[edit | edit source]

Fișierul de intrare scytalein.txt conține pe prima linie numărul c, mesajul si numarul m.

Date de ieșire[edit | edit source]

Fișierul de ieșire scytaleout.txt va conține pe prima linie mesajul criptat sau decriptat, in functie de c.

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

  • 1 ≤ n*m ≤ 1000000
  • mesajul va contine numai litere mari

Exemplul 1[edit | edit source]

scytalein.txt
1 WEAREDISCOVEREDFLEEATONCE 3
scytaleout.txt
Datele introduse corespund restricțiilor impuse.
WOEEVEAEARRTEEODDNIFCSLEC

Exemplul 2[edit | edit source]

scytalein.txt
2 WOEEVEAEARRTEEODDNIFCSLEC 3
scytaleout.txt
Datele introduse corespund restricțiilor impuse.
WEAREDISCOVEREDFLEEATONCE

Exemplul 3[edit | edit source]

scytalein.txt
2 WOEEVEAEARRTEEODDNIFCSLEC 300000
Datele introduse nu corespund restricțiilor impuse.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1">

  1. 3856 - Scytale

def validare(mesaj_validare, m_validare): # functia de validare a datelor de intrare

   if len(mesaj_validare) * m_validare > 1000000:
       raise ValueError
   fisier_iesire.write("Datele introduse corespund restrictiilor impuse.\n")


def criptare(mesaj_criptare, m_criptare): # functia de criptare

   criptat = ""
   for i in range(m_criptare):
       for j in range(i, len(mesaj_criptare), m_criptare):
           criptat += mesaj_criptare[j]
   return criptat


def decriptare(mesaj_decriptare, m_decriptare): # functia de decriptare

   n = len(mesaj_decriptare) // m_decriptare
   decriptat = ""
   for i in range(n):
       for j in range(i, len(mesaj_decriptare), n):
           decriptat += mesaj_decriptare[j]
   return decriptat


if __name__ == '__main__':

   fisier_intrare = open("scytalein.txt", "r")         # declararea fisierelor
   fisier_iesire = open("scytaleout.txt", "w")       # fisierul out trebuie declarat cu optiunea "w" (write)
   try:
       cerinta = int(fisier_intrare.readline())
       mesaj = fisier_intrare.readline().strip()
       m = int(fisier_intrare.readline())
       validare(mesaj, m)                 # apelul functiei de validare
       if cerinta == 1:
           fisier_iesire.write(criptare(mesaj, m))               # apelul functiei de criptare
       elif cerinta == 2:
           fisier_iesire.write(decriptare(mesaj, m))               # apelul functiei de decriptare
   except ValueError:
       fisier_iesire.write("Datele introduse nu corespund restrictiilor impuse.")
   except IndexError:
       fisier_iesire.write("Datele introduse nu corespund restrictiilor impuse.")

</syntaxhighlight>