3856 - Scytale

De la Universitas 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

# 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.")