Zadania przedstawione w tej sekcji zostały opracowane przez Centralną Komisję Egzaminacyjną i pojawiły się na egzaminie maturalnym z informatyki w maju 2016 roku (cz. 2). Cały arkusz można znaleźć na stronie internetowej CKE.

Zadanie 1. Szyfr Cezara

Podstawieniowy szyfr Cezara z przesunięciem (kluczemkluczkluczem) 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”.

R1VJo1rynNMFE
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

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”.

R1AAvfRIfROZF
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

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.

Zadanie 1.1

W pliku dane_1.txt znajduje się 100 słów. Słowa umieszczono w osobnych wierszach.

Napisz program, który zaszyfruje słowa z pliku z użyciem klucza k = 107. Wyniki zapisz do pliku wyniki_1.txt, każde słowo w osobnym wierszu, w porządku odpowiadającym kolejności słów z pliku z danymi.

Przykład 1

Fragment pliku z danymi:

INTERPRETOWANIE 
ROZWESELANIE 
KONSERWOWANIE

Poprawny wynik dla podanego fragmentu pliku:

LQWHUSUHWRZDQLH 
URCZHVHODQLH
NRQVHUZRZDQLH

Do oceny oddajesz:

  • plik wyniki_1.txt zawierający odpowiedź (zaszyfrowane słowa, zapisane w osobnych liniach),

  • plik(i) z komputerową realizacją zadania (kodem programu).

W załączonym pliku dane_1.txt znajdują się dane wejściowe. Każde słowo (łańcuch znakówłańcuch znakówłańcuch znaków) do zaszyfrowania znajduje się w oddzielnej linijce.

RUW6NgwJiVyuW

Przycisk do pobrania pliku TXT zawierającego dane.

Plik dane_1.txt.
Plik TXT o rozmiarze 1.29 KB w języku polskim

Rozwiąż zadanie dla danych wejściowych zapisanych w pliku dane_1.txt. Wykorzystaj w tym celu jeden z języków programowania: C++, Java lub Python. Zadbaj o prawidłowe wczytanie danych z pliku tekstowego do programu. Odpowiedź do zadania znajdziesz w osobnym pliku, umieszczonym po omówieniu pseudokodu.

Przykładowe rozwiązanie

Ważne!

W prezentowanych rozwiązaniach obu zadań omówionych w tej sekcji zastosowane zostaną dwie funkcje pomocnicze:

  • funkcja kod(znak) zwracająca kod ASCII podanego znaku (liczbę całkowitą)

Linia 1. funkcja kod otwórz nawias okrągły znak zamknij nawias okrągły. Linia 2. zwróć kod ASCII podanego znaku.
  • funkcja znak(kod) zwracająca znak o podanym kodzie ASCII (typ znakowy)

Linia 1. funkcja znak otwórz nawias okrągły kod zamknij nawias okrągły. Linia 2. zwróć znak o podanym kodzie.

Na początku ustalamy, o ile znaków będziemy przesuwać litery tekstu jawnego. W tym celu obliczamy resztę z dzielenia klucza przez wartość 26 (czyli liczbę liter w alfabecie łacińskim). Wczytujemy również dane z pliku.

Następnie iterujemy przy użyciu pętli po wszystkich wczytanych wyrazach. Każdy przetwarzany wyraz jest zapisywany do nowo tworzonej zmiennej slowo.

Aby zaszyfrować słowo, potrzebujemy dostępu do jego poszczególnych liter. Uzyskujemy go za pomocą pętli przechodzącej po znakach składających się na dane słowo.

Do każdego znaku tekstu jawnego dodajemy wartość klucza, co skutkuje przesunięciem o k liter w prawo. Jeżeli wartość znajdująca się w slowo[j] będzie większa od wartości kodu ASCII dla litery Z, zostanie od niej odjęta liczba 26.

Po zakończeniu pętli wewnętrznej każdorazowo zapisujemy zaszyfrowane słowo do pliku wynikowego.

Linia 1. n ← 100. Linia 2. k ← k mod 26. Linia 3. wyrazy otwórz nawias kwadratowy 0 kropka kropka n minus 1 zamknij nawias kwadratowy ← wczytaj dane z pliku cudzysłów dane podkreślnik 1 kropka txt cudzysłów. Linia 5. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek. Linia 6. slowo znak równości wyrazy otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 7. dla j znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły slowo zamknij nawias okrągły minus 1 wykonuj dwukropek. Linia 8. kod podkreślnik znaku ← kod otwórz nawias okrągły slowo otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias okrągły. Linia 9. kod podkreślnik znaku ← kod podkreślnik znaku plus k. Linia 10. jeżeli kod podkreślnik znaku zamknij nawias ostrokątny kod otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły. Linia 11. kod podkreślnik znaku ← kod podkreślnik znaku minus 26. Linia 12. slowo otwórz nawias kwadratowy j zamknij nawias kwadratowy ← znak otwórz nawias okrągły kod podkreślnik znaku zamknij nawias okrągły. Linia 13. zapisz slowo do pliku cudzysłów wyniki podkreślnik 1 kropka txt cudzysłów.

Odpowiedź dla danych zapisanych w pliku dane_1.txt:

R1CM31pCPZ1HE

Plik TXT o rozmiarze 1.19 KB w języku polskim

Schemat punktowania

  • 3 pkt. – za poprawny plik wynikowy,

  • 2 pkt. – za pominięcie ostatniego wiersza,

  • 1 pkt. – za plik z błędnym wykonaniem zawinięcia cyklicznego albo bez zawijania,

  • 0 pkt. – za odpowiedź błędną albo brak odpowiedzi.

Schemat punktowania został opracowany przez Centralną Komisję Egzaminacyjną. Cały arkusz oraz schematy punktowania można znaleźć na stronie internetowej CKE.

Zadanie 1.2

W pliku dane_2.txt zapisano 3000 szyfrogramówszyfrogramszyfrogramów i odpowiadające im klucze szyfrujące. W każdym wierszu znajduje się jeden szyfrogram i po pojedynczym znaku odstępu odpowiadający mu klucz (maksymalnie czterocyfrowa liczba).

Napisz program, który odszyfruje słowa zaszyfrowane podanymi kluczami. Wynik zapisz w pliku wyniki_2.txt – każde słowo w osobnym wierszu, w porządku odpowiadającym kolejności szyfrogramów z pliku z danymi.

Przykład 2

Przykładowe dane z pliku:

BCYKUNCM 1718 
YFOGNSKGYW 7580 
WARDA 9334

Poprawny wynik dla podanego fragmentu pliku:

ZAWISLAK 
KRASZEWSKI
WARDA

Do oceny oddajesz:

  • plik wyniki_2.txt zawierający odpowiedź (odszyfrowane słowa, zapisane w osobnych liniach),

  • plik(i) z komputerową realizacją zadania (kodem programu).

W pliku dane_2.txt znajdują się dane: każda para szyfrogram‑klucz zapisana jest w nowej linii.

Ważne!

Plik dane_2.txt jest zmodyfikowanym plikiem udostępnionym przez CKE na potrzeby egzaminu maturalnego. Modyfikacje polegają na uzupełnieniu brakujących kluczy w oficjalnym pliku.

R6TLnxpjmxuWk

Przycisk do pobrania pliku TXT z wynikiem zadania.

Plik dane_2.txt.
Plik TXT o rozmiarze 42.05 KB w języku polskim

Rozwiąż zadanie dla danych wejściowych zapisanych w pliku dane_2.txt. Wykorzystaj w tym celu jeden z języków programowania: C++, Java lub Python. Zadbaj o prawidłowe wczytanie danych z pliku tekstowego do programu. Odpowiedź do zadania znajdziesz w osobnym pliku, umieszczonym po omówieniu pseudokodu.

Przykładowe rozwiązanie

Na początku zapisujemy do zmiennych liczbę szyfrogramów do odczytania oraz tworzymy tablicę, w której zapiszemy dane z pliku (szyfrogram i klucz).

Mamy odszyfrować każdy szyfrogram za pomocą przypisanego mu klucza. Tworzymy pętlę, która będzie iterowała po odczytanych szyfrogramach.

Szyfrogram oraz klucz zapisujemy w nowych zmiennych. Następnie wykonujemy działania odwrotne niż w przypadku szyfrowania. Od każdej wartości znaku słowa odejmujemy wartość klucza. Spowoduje to przesunięcie o k liter w lewo.

Jeżeli wartość litery w kodowaniu ASCII zawartej w slowo[j] będzie mniejsza od wartości litery A, należy dodać do niej wartość 26.

Po zakończeniu pętli wewnętrznej za każdym razem zapisujemy odszyfrowane słowo do pliku wynikowego.

Linia 1. n ← 3000. Linia 2. szyfrogram otwórz nawias kwadratowy 0 kropka kropka 2999 zamknij nawias kwadratowy otwórz nawias kwadratowy 2 zamknij nawias kwadratowy ← wczytaj dane z pliku cudzysłów dane podkreślnik 2 kropka txt cudzysłów. Linia 4. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek. Linia 5. slowo ← szyfrogram otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 6. klucz ← szyfrogram otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy mod 26. Linia 7. dla j ← 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek dlugosc otwórz nawias okrągły slowo zamknij nawias okrągły minus 1 wykonuj dwukropek. Linia 8. kod podkreślnik znaku znak równości kod otwórz nawias okrągły slowo otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias okrągły. Linia 9. kod podkreślnik znaku ← kod podkreślnik znaku minus klucz. Linia 10. jeżeli kod podkreślnik znaku otwórz nawias ostrokątny kod otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły. Linia 11. kod podkreślnik znaku ← kod podkreślnik znaku plus 26. Linia 12. slowo otwórz nawias kwadratowy j zamknij nawias kwadratowy ← znak otwórz nawias okrągły kod podkreślnik znaku zamknij nawias okrągły. Linia 13. zapisz slowo do pliku cudzysłów wyniki podkreślnik 2 kropka txt cudzysłów.

Odpowiedź dla danych z pliku dane_2.txt:

RD5xGAZMorK5p

Przycisk do pobrania pliku TXT z wynikiem zadania.

Plik TXT o rozmiarze 24.82 KB w języku polskim

Schemat punktowania

  • 4 pkt. – za poprawny plik wynikowy.

  • 2 pkt. – za błędne dekodowanie jednej z liter alfabetu lub błędne rozwiązanie wynikające z błędu zawijania lub za błędne rozwiązanie wynikające z przyjęcia błędnej długości alfabetu (25).

  • 0 pkt. – za odpowiedź błędną albo za brak odpowiedzi.

Uwaga: Nie przyznaje się 3 p i 1 p.

Słownik

klucz
klucz

informacja, która jest wykorzystywana do szyfrowania i/lub deszyfrowania wiadomości

łańcuch znaków
łańcuch znaków

(ang. string) tekstowy typ danych, który służy do przechowywania ciągu znaków

szyfrogram
szyfrogram

zaszyfrowana wiadomość, inaczej kryptogram