3856 - Scytale

From Bitnami MediaWiki

Scytale

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

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

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

Date de ieșire

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

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

Exemplul 1

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

Exemplul 2

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

Exemplul 3

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

Rezolvare

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