3856 - Scytale
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">
- 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>