Rozwiązanie
Zadanie 6.2 – matura 2016, maj

Szyfr Cezara 
Podstawieniowy szyfr Cezara z przesunięciem (kluczem) k polega na zastąpieniu każdego znaku jawnego znakiem leżącym w alfabecie o k pozycji w prawo od zastępowanego znaku.
Przykład: znak ‘B’ po zakodowaniu kluczem k=3 zastąpiony zostanie znakiem ‘E’.
Przy szyfrowaniu znaku należy postępować w sposób cykliczny, to znaczy, jeżeli znak nie posiada w alfabecie następnika przesuniętego o k pozycji, to alfabet „zawija się" i za literą Z następuje znów litera A.
Przykład: jawny znak ‘X’ po zakodowaniu kluczem k=3 zastąpiony zostanie znakiem ‘A’, znak ‘Y’ – znakiem ‘B’, natomiast ‘Z’ – znakiem ‘C’.
W tym zadaniu rozpatrujemy tylko słowa zbudowane z wielkich liter alfabetu angielskiego (o kodach ASCII odpowiednio od 65 do 90), o długościach nie większych niż 30 znaków. W pliku dane_6_2.txt zapisano 3 000 szyfrogramów i odpowiadające im klucze szyfrujące. W każdym wierszu znajduje się jeden szyfrogram (zaszyfrowane słowo)
i po pojedynczym znaku odstępu odpowiadający mu klucz (maksymalnie czterocyfrowa liczba).
Fragment pliku dane_6_2.txt:
BCYKUNCM 1718
YFOGNSKGYW 7580
WARDA 9334 

Napisz program, który odszyfruje słowa zaszyfrowane podanymi kluczami. Wynik zapisz w pliku wyniki_6_2.txt: każde odszyfrowane słowo w osobnym wierszu, w porządku odpowiadającym kolejności szyfrogramów z pliku z danymi.
Uwaga:
Dla pierwszego szyfrogramu z pliku dane_6_2.txt (BCYKUNCM) wynikiem jest słowo ZAWISLAK.
def odszyfr(ciag, k):
    nowy_ciag = ""
    for lit in ciag:
        nowy_ord = 65+(ord(lit)-65-k) % 26
        nowy_ciag += chr(nowy_ord)
    return nowy_ciag

with open("wyniki_6_2.txt", "w") as wyjscie:
    with open("DANE_PR2/dane_6_2.txt") as wejscie:
        for linia in wejscie:
            if not linia:
                continue
            linia = linia.strip()
            try:
                ciag, k = linia.split()
            except:
                k = 0
            wyjscie.write(odszyfr(ciag, int(k))+"\n")

Pobierz rozwiązanie
Wyszukaj więcej zadań z tego arkusza...