3808 - ADFGVX

De la Universitas MediaWiki

ADFGVX

Cifrul ADFGVX este un cifru ce folosește o matrice 6x6 care conţine literele alfabetului englez si cifre. Cifrul functioneaza asa: se citeste matricea, un mesajul si o cheie. In matrice, linia 1 si coloana 1 au codul A, linia 2 si coloana 2 au codul D, linia 3 si coloana 3 au codul F, linia 4 si coloana 4 au codul G, linia 5 si coloana 5 au codul V, iar linia 6 si coloana 6 au codul X. Fiecare litera din mesaj este inlocuita cu un codul liniei si coloanei pe care se afla in matrice. literele codurilor obtinute sunt puse intr-o matrice care are atatea coloane cate caractere are cheia(ultima linie a noii matrici poate fi incompleta). coloanele noii matrici au codul literei din cheie de pe pozitia egala cu numarul de ordine al coloanei. coloanele sunt sortate in functie de ordinea alfabetica al literei pe care o au asociata. In final se afiseaza matricea noua parcursa pe coloane (pentru a fi mai clar, literele se afiseaza fara spatii intre ele, iar cand se trece pe o noua coloana, se va pune un spatiu).

Cerința

Vi se ofera un numar c si matricea pentru criptare.Pentru c=1, vi se ofera un mesaj si o cheie si trebuie sa criptati mesajul. Pentru c=2, vi se ofera mesajul criptat si o cheie si trebuie sa decriptati mesajul.h1.

Date de intrare

Fișierul de intrare adfgvxin.txt conține pe prima linie numărul c, iar pe urmatoarele linii matricea, mesajul si cheia.

Date de ieșire

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

Restricții și precizări

  • 1 ≤ lungimea mesajului necriptat ≤ 1000000
  • 1≤c≤2
  • cheia va avea numai litere distincte h1.

Exemplul 1

adfgvxin.txt
1
NA1C3H
8TB2OM
E5WRPD
4F6G7I
9J0KLQ
SUVXYZ
ATTACKAT1200AM PRIVACY
adfgvx.out
Datele introduse corespund restricțiilor impuse.
DGDD DAGD DGAF ADDF DADV DVFA ADVX

Exemplul 2

adfgvxin.txt
2
NA1C3H
8TB2OM
E5WRPD
4F6G7I
9J0KLQ
SUVXYZ
DGDD DAGD DGAF ADDF DADV DVFA ADVX PRIVACY
adfgvx.out
Datele introduse corespund restricțiilor impuse.
ATTACKAT1200AM

Explicatie

codul literelor va fi: AD,DD,DD,AD,AG,VG,AD,DD,AF,DG,VF,VF,AD,DX. Matricea noua va arata astfel:

P R I V A C Y

A D D D D D A

D A G V G A D

D D A F D G V

F V F A D D X

Dupa ce sortam coloanele, matricea va arata astfel:

A C I P R V Y

D D D A D D A

G A G D A V D

D G A D D F V

D D F F V A X

Exemplul 3

adfgvxin.txt
2
NA1C3H
8TB2OM
E5WRPD
4F6G7I
9J0KLQ
PRIVACY
DGDD DAGD DGAF ADDF DADV DVFA ADVX
adfgvx.out
Datele introduse nu corespund restricțiilor impuse.

Rezolvare

# 3808 - ADFGVX
def validare(matrice_validare, mesaj_validare):           # functia de validare a datelor de intrare
    if len(mesaj_validare) > 1000000:
        raise ValueError

    for linie in matrice_validare:
        if len(linie) != 6:    # fiecare linie trebuie sa aiba 6 caractere
            raise ValueError

    fisier_iesire.write("Datele introduse corespund restrictiilor impuse.\n")


def codificare(matrice_codificare, mesaj_codificare):                     # functia de rezolvare
    codificat = ""
    for litera in mesaj_codificare:
        for i in range(6):
            for j in range(6):
                if matrice_codificare[i][j] == litera:
                    codificat += "ADFGVX"[i] + "ADFGVX"[j]
    return codificat


if __name__ == '__main__':
    fisier_intrare = open("adfgvxin.txt", "r")         # declararea fisierelor
    fisier_iesire = open("adfgvxout.txt", "w")       # fisierul out trebuie declarat cu optiunea "w" (write)

    try:
        cerinta = int(fisier_intrare.readline())
        matrice = [list(fisier_intrare.readline().strip()) for _ in range(6)]
        cheie = fisier_intrare.readline().strip()
        mesaj = fisier_intrare.readline().strip()

        validare(matrice, mesaj)                 # apelul functiei de validare
        if cerinta == 1:
            fisier_iesire.write(codificare(matrice, mesaj))               # apelul functiei de rezolvare

    except ValueError:
        fisier_iesire.write("Datele introduse nu corespund restrictiilor impuse.")
    except IndexError:
        fisier_iesire.write("Datele introduse nu corespund restrictiilor impuse.")