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