Rozwiązanie
Zadanie 6.3 – 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_3.txt zapisano 3 000 par słów, po jednej parze w wierszu, oddzielonych pojedynczym znakiem odstępu. Drugie słowo w każdej parze jest szyfrogramem pierwszego
z nieznanym kluczem.
Niektóre szyfrogramy są błędne, co oznacza, że niektóre litery w słowie zakodowano z różnymi przesunięciami. Słowo ma zawsze tę samą długość co odpowiadający mu szyfrogram.
Fragment pliku dane_6_3.txt:
ZAWISLAK EFBNXQFP
KRASZEWSKI XENFMRJFXV

Napisz program, który wyszuka i wypisze te słowa z pliku dane_6_3.txt, które błędnie zaszyfrowano. Wynik zapisz w pliku wyniki_6_3.txt: każde słowo w osobnym wierszu, w porządku odpowiadającym kolejności tych słów z pliku z danymi.
Uwaga:
Pierwsze słowo w pliku wynikowym to SMIGIELSKI.
def szyfr(ciag, k):
    nowy_ciag = ""
    for lit in ciag:
        nowy_ord = 65+(ord(lit)-65+k) % 26
        nowy_ciag += chr(nowy_ord)
    return nowy_ciag

def szukaj(ciag, ciag2):
    def zdobadz_klucz(znak, znak2):
        if ord(znak2) < ord(znak):
            return 26-(ord(znak)-ord(znak2))
        else:
            return abs(ord(znak2)-ord(znak))
    roz = zdobadz_klucz(ciag[0], ciag2[0])
    if ciag2 != szyfr(ciag, roz):
        return False
    return True

with open("wyniki_6_3.txt", "w") as wyjscie:
    with open("DANE_PR2/dane_6_3.txt") as wejscie:
        for linia in wejscie:
            linia = linia.strip()
            ciag1, ciag2 = linia.split()
            if not szukaj(ciag1, ciag2):
                wyjscie.write(ciag1+"\n")

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