Zadanie 1

Szkolny klub naukowy NEUTRON swoje pozalekcyjne spotkania prowadzi online za pośrednictwem specjalnego komunikatora internetowego. Każda konwersacja wideo ma swój indywidualny identyfikator składający się z 16 wielkich liter alfabetu łacińskiego, przy czym żadna litera nie może w nim wystąpić więcej niż dwa razy. Dołączenie do spotkania wymaga znajomości identyfikatora.

Za każdym razem, gdy zaplanowane jest spotkanie klubu, jego przewodnicząca rozsyła uczestnikom e‑mail z wiadomością częściowo zaszyfrowaną algorytmem Vigenère’a.

Wiadomości zawierają pozornie losowe ciągi znaków składające się wyłącznie z:

  • wielkich liter alfabetu łacińskiego,

  • znaków przestankowych (kropek i przecinków),

  • spacji.

Każdy członek po dołączeniu do klubu otrzymał instrukcję opisującą proces odczytywania identyfikatorów spotkań z przesyłanych wiadomości. Prezentuje się ona następująco:

Pierwszym krokiem jest odczytanie klucza szyfrującego użytego do zaszyfrowania części e‑maila. Jest nim pierwszy wyraz wiadomości, po którym następuje kropka. Dalsza część tekstu to już szyfrogramszyfrogramszyfrogram, w którym ukryty jest poszukiwany identyfikator. Aby go odczytać, należy najpierw rozszyfrować ciąg znaków, a następnie odszukać w nim fragmenty składające się z trzech tych samych liter. Po takim ciągu zawsze następne cztery litery stanowią część identyfikatora. W wiadomości znajdują się cztery fragmenty składające się na identyfikator.

Przykład 1

Treść wiadomości e‑mail.

Linia 1. GPWDRL kropka HZOMWDGEK przecinek OJVU PWEBD kropka YHOWPQMAGRNPX DHSGAUAKO kropka. Linia 2. BE O NSZNTDRRF NPXG przecinek ELZLHWO kropka.

Klucz szyfrujący to pierwszy wyraz wiadomości, po którym następuje kropka; w tym przypadku jest to następujący łańcuch znaków:

Linia 1. GPWDRL.

Usuwamy go z treści wiadomości. Odszyfrowujemy wiadomość, używając go jako klucza.

Odszyfrowana wiadomość:

Linia 1. BKSJFSAPO przecinek LSKO AABKS kropka SSSTYFGLKOWER OLPPPOLOL kropka. Linia 2. KT I YWWWIXCVC WERR przecinek IIIABHS kropka.

Pierwszy fragment identyfikatora znajduje się po trzykrotnie powtórzonej literze S:

Linia 1. TYFG.

Drugi fragment identyfikatora odnajdujemy jako pierwsze cztery litery znajdujące się za trzykrotnie powtórzoną literą P:

Linia 1. OLOL.

Następnie poszukujemy kolejnego fragmentu tekstu złożonego z trzech identycznych liter. Po znalezieniu trzykrotnie powtórzonej litery W odczytujemy umieszczony za nimi trzeci fragment identyfikatora:

Linia 1. IXCV.

Wyszukujemy ostatnią sekwencję trzech identycznych liter i odczytujemy ostatni element identyfikatora. Czwartym znalezionym w ten sposób fragmentem jest poprzedzony trzema literami I ciąg:

Linia 1. ABHS.

Pełen identyfikator złożony ze znalezionych fragmentów ma postać:

Linia 1. TYFGOLOLIXCVABHS.

Zadanie 1.1

Na twoją skrzynkę e‑mailową regularnie przesyłane są zaszyfrowane wiadomości dotyczące spotkania klubu naukowego NEUTRON, których długość nie przekracza 100 znaków.

W pliku dane.txt znajduje się zaszyfrowana wiadomość.

R1ivKl5IaCoji

Przycisk do pobrania pliku TXT z treścią zadania.

Plik TXT o rozmiarze 106.00 B w języku polskim

Napisz program, który wyszuka identyfikator konwersacji ukryty w zaszyfrowanej wiadomości zapisanej w pliku dane.txt (po uprzednim odszyfrowaniu wiadomości). Wynik zapisz w pliku wyniki1_1.txt.

Do oceny oddajesz:

  • plik wyniki1_1.txt zawierający odpowiedź (identyfikator konwersacji),

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

Przykład 2

Przykładowe dane:

FORMAT. NZBE PEXR, LGUPWYE XLI. NZCXAUHQ JMRM TZ, ZW DH. UCEE IPP ORMYQEJ CAL, NZFIMPIUPOVI. BBHP XOD UCB.

Przykładowy wynik:

WRKNABCCYXZVBXJI

Rozwiąż zadanie dla danych wejściowych załączonych w pliku dane.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 pliku umieszczonym po omówieniu pseudokodu.

Przykładowe rozwiązanie

Ważne!

Przy wykonywaniu opisanych w zadaniu operacji przydatne będzie operowanie na kodach ASCIIASCIIASCII, pozwalających na reprezentowanie wybranych znaków w postaci liczb całkowitych.

Zdefiniujemy dwie dodatkowe funkcje, które następnie wykorzystamy w przedstawionych w rozwiązaniach pseudokodach:

  • znakDoKodu(znak) – funkcja, która jako parametr przyjmuje pojedynczy znak, a następnie konwertuje go na odpowiadający mu kod ASCII i zwraca otrzymaną wartość liczbową,

  • kodDoZnaku(kod) – funkcja, która jako parametr przyjmuje kod ASCII w postaci liczby całkowitej z zakresu od 0 do 127, a następnie konwertuje ją na odpowiadający jej znak oraz go zwraca.

Na początku korzystamy z dwóch tablic pomocniczych: kluczPomoc[0..p‑1] oraz szyfrPomoc[0..p‑1] (gdzie p oznacza długość wiadomości), do których zapisujemy odpowiednio odnaleziony klucz oraz zaszyfrowaną wiadomość. Nie są to jednak docelowe tablice, na których będziemy operować w dalszej części algorytmu. Obliczamy również liczbę znaków klucza a oraz liczbę znaków wiadomości b, które definiują rozmiar tablicy klucz[0..a‑1]szyfr[0..b‑1].

Definiujemy dwie dodatkowe zmienne (x oraz j):

Linia 1. a ← 0. Linia 2. b ← 0. Linia 3. j ← 0. Linia 4. x ← 0.

Do tablicy kluczPomoc[0..p‑1] zapisujemy kolejne litery wiadomości zawartej w tablicy mail[0..p‑1]. Jeżeli natrafimy na kropkę, przerywamy działanie pętli (zakładamy, że klucz został odnaleziony) i obliczamy indeks pierwszego elementu tablicy mail[0..p‑1] po odnalezionej kropce (przechowujemy go w zmiennej x). Jeżeli analizowany znak nie jest ani literą, ani kropką, przypisujemy zmiennym a oraz j ich początkowe wartości (odpowiednio 0 i 0), aby od nowa zacząć wypełniać tablicę kluczPomoc (pierwszym znakiem po poszukiwanym kluczu zawsze będzie kropka). Pamiętamy też o aktualizowaniu wartości przechowywanej w zmiennej a.

Linia 1. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek p minus 1 wykonuj dwukropek. Linia 2. jeżeli znakDoKodu otwórz nawias okrągły mail otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły znak równości znakDoKodu otwórz nawias okrągły apostrof kropka apostrof zamknij nawias okrągły dwukropek. Linia 3. x ← i plus 1. Linia 4. przerwij pętlę. Linia 5. jeżeli znakDoKodu otwórz nawias okrągły mail otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≥ znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły i znakDoKodu otwórz nawias okrągły mail otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≤ znakDoKodu otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły dwukropek. Linia 6. kluczPomoc otwórz nawias kwadratowy j zamknij nawias kwadratowy ← mail otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 7. a ← a plus 1. Linia 8. j ← j plus 1. Linia 9. w przeciwnym razie dwukropek. Linia 10. a ← 0. Linia 11. j ← 0.

Resztę wiadomości (rozpoczynając od elementu tablicy mail[0..p‑1] o indeksie x) zapisujemy do tablicy szyfrPomoc[0..p‑1].

Linia 1. j ← 0. Linia 2. dla i znak równości x przecinek x plus 1 przecinek kropka kropka kropka przecinek p minus 1 wykonuj dwukropek. Linia 3. szyfrPomoc otwórz nawias kwadratowy j zamknij nawias kwadratowy ← mail otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 4. b ← b plus 1. Linia 5. j ← j plus 1.

Gdy już znamy liczbę znaków składających się na klucz oraz wiadomość, tworzymy dwie tablice: klucz[0..a - 1] oraz szyfr[0..b - 1], do których zapisujemy wyróżnione dwa ciągi znaków.

Linia 1. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek a minus 1 wykonuj dwukropek. Linia 2. klucz otwórz nawias kwadratowy i zamknij nawias kwadratowy ← kluczPomoc otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 4. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek b minus 1 wykonuj dwukropek. Linia 5. szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy ← szyfrPomoc otwórz nawias kwadratowy i zamknij nawias kwadratowy.

Następnie definiujemy zmienną j, która będzie przechowywać indeks aktualnie wykorzystywanej litery klucza. Inicjalizujemy zmienną wartością 0.

Linia 1. j ← 0.

Wykorzystamy również tablicę wynik, której zadaniem jest przechowywanie identyfikatora spotkania. Jej długość jest równa 16, ponieważ jest to domyślna liczba znaków w identyfikatorze.

Teraz przejdziemy do rozszyfrowywania wiadomości. Wykorzystywanym kluczem będzie słowo FORMAT, natomiast pozostała treść przykładowego e‑maila prezentuje się następująco:

Linia 1. kropka NZBE PEXR przecinek LGUPWYE XLI kropka NZCXAUHQ JMRM TZ przecinek ZW DH kropka UCEE IPP ORMYQEJ CAL przecinek NZFIMPIUPOVI kropka BBHP XOD UCB kropka.

Deszyfracji podlegają jedynie litery wiadomości. Sprawdzamy, czy aktualnie deszyfrowany znak ma kod ASCII z zakresu od 65 (wielka litera A) do 90 (wielka litera Z).

Linia 1. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek b minus 1 wykonuj dwukropek. Linia 2. jeżeli znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≥ znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły i znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≤ znakDoKodu otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły dwukropek.

Jeżeli rozpatrywany znak jest literą, wówczas na podstawie klucza ustalamy odpowiadający mu znak tekstu jawnegotekst jawnytekstu jawnego. Od kodu ASCII elementu tablicy szyfr o indeksie i odejmujemy kod odpowiedniego znaku klucza, pomniejszony o 65 (kod litery A). Otrzymaną liczbę konwertujemy do znaku, po czym zapisujemy do i-tego elementu tablicy.

Linia 1. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek b minus 1 wykonuj dwukropek. Linia 2. jeżeli znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≥ znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły i znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≤ znakDoKodu otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły dwukropek. Linia 3. szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy ← kodDoZnaku otwórz nawias okrągły znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły minus otwórz nawias okrągły znakDoKodu otwórz nawias okrągły klucz otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias okrągły minus znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły.

Należy uwzględnić sytuację, w której otrzymany znak nie jest wielką literą alfabetu łacińskiego. Dzieje się tak, gdy w wyniku opisanej operacji otrzymujemy kod ASCII mniejszy od liczby 65. Wówczas do kodu dodajemy 26 (rozmiar alfabetu), konwertujemy go do znaku, a następnie zapisujemy do tablicy szyfr.

Linia 1. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek b minus 1 wykonuj dwukropek. Linia 2. jeżeli znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≥ znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły i znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≤ znakDoKodu otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły dwukropek. Linia 3. szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy ← kodDoZnaku otwórz nawias okrągły znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły minus otwórz nawias okrągły znakDoKodu otwórz nawias okrągły klucz otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias okrągły minus znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły. Linia 4. jeżeli znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias ostrokątny znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły dwukropek. Linia 5. szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy ← kodDoZnaku otwórz nawias okrągły znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły plus 26 zamknij nawias okrągły.

Po każdorazowym rozpatrzeniu znaku będącego literą, dokonujemy inkrementacji zmiennej j wskazującej aktualną literę klucza wykorzystywaną do procesu deszyfrowania. Jeżeli wykorzystamy już wszystkie litery klucza (wartość zmiennej j wyniesie a), wówczas kolejnej literze wiadomości odpowiadać będzie ponownie pierwszy znak klucza.

Linia 1. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek b minus 1 wykonuj dwukropek. Linia 2. jeżeli znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≥ znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły i znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≤ znakDoKodu otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły dwukropek. Linia 3. szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy ← kodDoZnaku otwórz nawias okrągły znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły minus otwórz nawias okrągły znakDoKodu otwórz nawias okrągły klucz otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias okrągły minus znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły. Linia 4. jeżeli znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias ostrokątny znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły dwukropek. Linia 5. szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy ← kodDoZnaku otwórz nawias okrągły znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły plus 26 zamknij nawias okrągły. Linia 6. jeżeli j znak równości a minus 1 dwukropek. Linia 7. j ← 0. Linia 8. w przeciwnym razie. Linia 9. j ← j plus 1.

Przygotowana część programu pozwoli rozszyfrować otrzymaną wiadomość. Przejdźmy do odszukania w tekście jawnym identyfikatora.

Rozpoczynamy od definicji dwóch zmiennych: l i k, które przechowywać będą odpowiednio indeks aktualnie rozpatrywanego elementu tablicy szyfr (zawierającej już rozszyfrowaną wiadomość) oraz indeks tablicy wynik, do którego z kolei będziemy zapisywać następny odnaleziony znak identyfikatora.

Linia 1. l ← 0. Linia 2. k ← 0.

W celu odnalezienia czteroznakowych fragmentów identyfikatora należy znaleźć w odszyfrowanej wiadomość trzy sąsiednie, powtarzające się litery. Warto zwrócić uwagę, że wcale nie musimy iterować po każdym elemencie tablicy szyfr. Możemy założyć, że jeżeli wśród siedmiu ostatnich znaków wiadomości pierwsze trzy litery nie są identyczne, to z pewnością cztery kolejne nie stanowią poszukiwanego identyfikatora. Tę zależność wyrazimy poprzez warunek pętli dopóki.

Linia 1. dopóki k otwórz nawias ostrokątny otwórz nawias okrągły b minus 6 zamknij nawias okrągły wykonuj dwukropek.

Podobnie jak w przypadku procesu deszyfrowania również podczas poszukiwania identyfikatora rozpatrujemy jedynie litery alfabetu.

Linia 1. dopóki k otwórz nawias ostrokątny otwórz nawias okrągły b minus 6 zamknij nawias okrągły wykonuj dwukropek. Linia 2. jeżeli znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy k zamknij nawias kwadratowy zamknij nawias okrągły ≥ znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły i znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy k zamknij nawias kwadratowy zamknij nawias okrągły ≤ znakDoKodu otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły dwukropek.

Jeżeli analizowany znak okaże się literą, sprawdzamy, czy dwa kolejne elementy tablicy (o indeksach odpowiednio k + 1 oraz k + 2) zawierają tę samą literę.

Linia 1. dopóki k otwórz nawias ostrokątny otwórz nawias okrągły b minus 6 zamknij nawias okrągły wykonuj dwukropek. Linia 2. jeżeli znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy k zamknij nawias kwadratowy zamknij nawias okrągły ≥ znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły i znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy k zamknij nawias kwadratowy zamknij nawias okrągły ≤ znakDoKodu otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły dwukropek. Linia 3. jeżeli szyfr otwórz nawias kwadratowy k zamknij nawias kwadratowy znak równości szyfr otwórz nawias kwadratowy k plus 1 zamknij nawias kwadratowy i szyfr otwórz nawias kwadratowy k zamknij nawias kwadratowy znak równości szyfr otwórz nawias kwadratowy k plus 2 zamknij nawias kwadratowy dwukropek.

Jeśli warunek ten zostanie spełniony, do czterech kolejnych elementów tablicy wynik zapisujemy odnalezione litery identyfikatora. Podczas tego procesu pamiętajmy o każdorazowym inkrementowaniu zmiennej l.

Linia 1. dopóki k otwórz nawias ostrokątny otwórz nawias okrągły b minus 6 zamknij nawias okrągły wykonuj dwukropek. Linia 2. jeżeli znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy k zamknij nawias kwadratowy zamknij nawias okrągły ≥ znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły i znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy k zamknij nawias kwadratowy zamknij nawias okrągły ≤ znakDoKodu otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły dwukropek. Linia 3. jeżeli szyfr otwórz nawias kwadratowy k zamknij nawias kwadratowy znak równości szyfr otwórz nawias kwadratowy k plus 1 zamknij nawias kwadratowy i szyfr otwórz nawias kwadratowy k zamknij nawias kwadratowy znak równości szyfr otwórz nawias kwadratowy k plus 2 zamknij nawias kwadratowy dwukropek. Linia 4. dla i znak równości 0 przecinek 1 przecinek 2 przecinek 3 wykonuj dwukropek. Linia 5. wynik otwórz nawias kwadratowy l zamknij nawias kwadratowy ← szyfr otwórz nawias kwadratowy k plus 3 plus i zamknij nawias kwadratowy. Linia 6. l ← l plus 1.

Ostatnim krokiem jest zwiększanie wartości zmiennej k. Jeżeli aktualnie sprawdzany znak nie jest literą bądź nie rozpoczyna trzyznakowego ciągu wskazującego na obecność identyfikatora, wówczas wykonujemy inkrementację zmiennej. W przypadku gdy odnaleźliśmy fragment identyfikatora, do wartości zmiennej k dodajemy 6, ponieważ w ramach procesu zapisu identyfikatora do tablicy wynik w sumie rozpatrujemy siedem kolejnych znaków (aktualnie rozpatrywany znak, dwa kolejne identyczne znaki oraz czteroliterowy kod).

Linia 1. dopóki k otwórz nawias ostrokątny otwórz nawias okrągły b minus 6 zamknij nawias okrągły wykonuj dwukropek. Linia 2. jeżeli znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy k zamknij nawias kwadratowy zamknij nawias okrągły ≥ znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły i znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy k zamknij nawias kwadratowy zamknij nawias okrągły ≤ znakDoKodu otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły dwukropek. Linia 3. jeżeli szyfr otwórz nawias kwadratowy k zamknij nawias kwadratowy znak równości szyfr otwórz nawias kwadratowy k plus 1 zamknij nawias kwadratowy i szyfr otwórz nawias kwadratowy k zamknij nawias kwadratowy znak równości szyfr otwórz nawias kwadratowy k plus 2 zamknij nawias kwadratowy dwukropek. Linia 4. dla i znak równości 0 przecinek 1 przecinek 2 przecinek 3 wykonuj dwukropek. Linia 5. wynik otwórz nawias kwadratowy l zamknij nawias kwadratowy ← szyfr otwórz nawias kwadratowy k plus 3 plus i zamknij nawias kwadratowy. Linia 6. l ← l plus 1. Linia 7. k ← k plus 6. Linia 8. w przeciwnym razie dwukropek. Linia 9. k ← k plus 1. Linia 10. w przeciwnym razie dwukropek. Linia 11. k ← k plus 1.

Zwracamy tablicę z identyfikatorem spotkania.

Linia 1. zwróć wynik.

Gotowy algorytm zapisany za pomocą pseudokodu wygląda następująco:

Linia 1. a ← 0. Linia 2. b ← 0. Linia 3. j ← 0. Linia 4. x ← 0. Linia 6. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek p minus 1 wykonuj dwukropek. Linia 7. jeżeli znakDoKodu otwórz nawias okrągły mail otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły znak równości znakDoKodu otwórz nawias okrągły apostrof kropka apostrof zamknij nawias okrągły dwukropek. Linia 8. x ← i plus 1. Linia 9. przerwij pętlę. Linia 10. jeżeli znakDoKodu otwórz nawias okrągły mail otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≥ znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły i znakDoKodu otwórz nawias okrągły mail otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≤ znakDoKodu otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły dwukropek. Linia 11. kluczPomoc otwórz nawias kwadratowy j zamknij nawias kwadratowy ← mail otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 12. a ← a plus 1. Linia 13. j ← j plus 1. Linia 14. w przeciwnym razie dwukropek. Linia 15. a ← 0. Linia 16. j ← 0. Linia 18. j ← 0. Linia 20. dla i znak równości x przecinek x plus 1 przecinek kropka kropka kropka przecinek p minus 1 wykonuj dwukropek. Linia 21. szyfrPomoc otwórz nawias kwadratowy j zamknij nawias kwadratowy ← mail otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 22. b ← b plus 1. Linia 23. j ← j plus 1. Linia 25. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek a minus 1 wykonuj dwukropek. Linia 26. klucz otwórz nawias kwadratowy i zamknij nawias kwadratowy ← kluczPomoc otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 28. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek b minus 1 wykonuj dwukropek. Linia 29. szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy ← szyfrPomoc otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 31. j ← 0. Linia 33. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek b minus 1 wykonuj dwukropek. Linia 34. jeżeli znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≥ znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły i znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≤ znakDoKodu otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły dwukropek. Linia 35. szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy ← kodDoZnaku otwórz nawias okrągły znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły minus otwórz nawias okrągły znakDoKodu otwórz nawias okrągły klucz otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias okrągły minus znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły. Linia 36. jeżeli znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias ostrokątny znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły dwukropek. Linia 37. szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy ← kodDoZnaku otwórz nawias okrągły znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły plus 26 zamknij nawias okrągły. Linia 38. jeżeli j znak równości a minus 1 dwukropek. Linia 39. j ← 0. Linia 40. w przeciwnym razie. Linia 41. j ← j plus 1. Linia 43. l ← 0. Linia 44. k ← 0. Linia 46. dopóki k otwórz nawias ostrokątny otwórz nawias okrągły b minus 6 zamknij nawias okrągły wykonuj dwukropek. Linia 47. jeżeli znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy k zamknij nawias kwadratowy zamknij nawias okrągły ≥ znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły i znakDoKodu otwórz nawias okrągły szyfr otwórz nawias kwadratowy k zamknij nawias kwadratowy zamknij nawias okrągły ≤ znakDoKodu otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły dwukropek. Linia 48. jeżeli szyfr otwórz nawias kwadratowy k zamknij nawias kwadratowy znak równości szyfr otwórz nawias kwadratowy k plus 1 zamknij nawias kwadratowy i szyfr otwórz nawias kwadratowy k zamknij nawias kwadratowy znak równości szyfr otwórz nawias kwadratowy k plus 2 zamknij nawias kwadratowy dwukropek. Linia 49. dla i znak równości 0 przecinek 1 przecinek 2 przecinek 3 wykonuj dwukropek. Linia 50. wynik otwórz nawias kwadratowy l zamknij nawias kwadratowy ← szyfr otwórz nawias kwadratowy k plus 3 plus i zamknij nawias kwadratowy. Linia 51. l ← l plus 1. Linia 52. k ← k plus 6. Linia 53. w przeciwnym razie dwukropek. Linia 54. k ← k plus 1. Linia 55. w przeciwnym razie dwukropek. Linia 56. k ← k plus 1. Linia 58. zapisz wynik do pliku cudzysłów wyniki1 podkreślnik 1 kropka txt cudzysłów.

Odpowiedź

Odpowiedź do zadania znajduje się w pliku wyniki1_1.txt:

R1BuDzts6BdCM

Przycisk do pobrania pliku TXT z treścią zadania.

Plik TXT o rozmiarze 16.00 B w języku polskim

Zadanie 1.2.

Poproszono cię o przygotowanie wiadomości z zaszyfrowanym identyfikatorem spotkania klubu NEUTRON. Przewodnicząca przekazała ci wzór niezaszyfrowanej wiadomości. Symbolem „*” oznaczone są w nim pozycje, na których powinny znaleźć się znaki docelowego identyfikatora. Sam identyfikator wysłany został w osobnej wiadomości. Wzór wiadomości znajduje się w pierwszej linijce w pliku tekstowym dane2.txt, natomiast identyfikator w drugiej.

Napisz program, który w odpowiednie miejsca wzoru wiadomości wprowadzi litery kodu spotkania, a następnie zaszyfruje wiadomość (z wyłączeniem klucza na początku tekstu, który należy wykorzystać do szyfrowania). Wynik zapisz w pliku wyniki1_2.txt.

Do oceny oddajesz:

  • plik wyniki1_2.txt zawierający odpowiedź (uzupełnioną i zaszyfrowaną wiadomość);

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

Przykład 3

Przykładowe dane:

FORMAT. ILKS PLSD, UUU**** LLP. ILLL**** SART OL, IK DO. PONS IWK AAA**** LOL, UURRAPPP****. IWTY LOK POK. 
WRKNABCCYXZVBXJI 

Przykładowy wynik:

FORMAT. NZBE PEXR, LGUPWYE XLI. NZCXAUHQ JMRM TZ, ZW DH. UCEE IPP ORMYQEJ CAL, NZFIMPIUPOVI. BBHP XOD UCB.   

Wzór wiadomości i identyfikator znajdują się w pliku dane2.txt:

R12OojvqUfdCo

Przycisk do pobrania pliku TXT z treścią zadania.

Plik TXT o rozmiarze 124.00 B w języku polskim

Rozwiąż zadanie dla danych wejściowych z pliku dane2.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ątek z tablicy wzor[0..p - 1], do której została wczytana pierwsza linijka pliku z danymi, odczytujemy ciąg znaków stanowiący klucz szyfrujący. Identyfikator, czyli drugą linijkę pliku z danymi, zapisujemy w tablicy identyfikator[0..15].

Linia 1. a ← 0. Linia 2. j ← 0. Linia 4. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek p minus 1 wykonuj dwukropek. Linia 5. jeżeli znakDoKodu otwórz nawias okrągły wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły znak równości znakDoKodu otwórz nawias okrągły apostrof kropka apostrof zamknij nawias okrągły dwukropek. Linia 6. przerwij pętlę. Linia 7. jeżeli znakDoKodu otwórz nawias okrągły wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≥ znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły i znakDoKodu otwórz nawias okrągły wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≤ znakDoKodu otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły dwukropek. Linia 8. kluczPomoc otwórz nawias kwadratowy j zamknij nawias kwadratowy ← wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 9. a ← a plus 1. Linia 10. j ← j plus 1. Linia 11. w przeciwnym razie dwukropek. Linia 12. a ← 0. Linia 13. j ← 0. Linia 15. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek a minus 1 wykonuj dwukropek. Linia 16. klucz otwórz nawias kwadratowy i zamknij nawias kwadratowy ← kluczPomoc otwórz nawias kwadratowy i zamknij nawias kwadratowy.

Następnie definiujemy zmienną k, która przechowywać będzie indeks litery aktualnie zapisywanej w wyznaczonym miejscu w wiadomości. Inicjalizujemy zmienną wartością 0. Wykorzystamy również tablicę wynik2[0..p‑1], do której zapiszemy zaszyfrowaną wiadomość.

Linia 1. k ← 0.

Przechodzimy po wszystkich znakach wiadomości, poszukując znaków „*” – gdy na taki natrafimy, w jego miejsce wpisujemy k-ty znak identyfikatora oraz inkrementujemy zmienną k.

Linia 1. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek p minus 1 wykonuj dwukropek. Linia 2. jeżeli znakDoKodu otwórz nawias okrągły wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły znak równości znakDoKodu otwórz nawias okrągły apostrof asterysk apostrof zamknij nawias okrągły dwukropek. Linia 3. wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy ← identyfikator otwórz nawias kwadratowy k zamknij nawias kwadratowy. Linia 4. k ← k plus 1.

Następnym krokiem jest zdefiniowanie zmiennej l oraz zainicjalizowanie jej wartością 0. Zmienną tę wykorzystamy do przechowywania indeksu elementu tablicy wzor, będącego pierwszym znakiem po kluczu szyfrującym. Z treści zadania wiemy, że będzie to pierwsza kropka w wiadomości.

Linia 1. l ← 0.

W kolejnym kroku wyszukujemy w wiadomości pierwszą kropkę, a następnie zapisujemy do zmiennej l indeks elementu tablicy wzor, w którym jest przechowywana.

Linia 1. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek p minus 1 wykonuj dwukropek. Linia 2. jeżeli znakDoKodu otwórz nawias okrągły wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły znak równości znakDoKodu otwórz nawias okrągły apostrof kropka apostrof zamknij nawias okrągły dwukropek. Linia 3. l ← i. Linia 4. przerwij pętlę.

Wiemy teraz, że proces szyfrowania wiadomości rozpoczniemy od l-tego elementu tablicy wzor. Dodatkowo definiujemy zmienną j, która przechowywać będzie indeks litery klucza aktualnie wykorzystywanej w procesie szyfrowania. Inicjalizujemy ją wartością 0.

Linia 1. j ← 0.

Proces szyfrowania przebiegać będzie podobnie do omówionej wcześniej operacji deszyfrowania. Dodatkowo znaki nieprzeznaczone do szyfrowania będziemy bezpośrednio przepisywać do tablicy wynik2.

Linia 1. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek p minus 1 wykonuj dwukropek. Linia 2. jeżeli i ≤ l dwukropek. Linia 3. wynik2 otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 4. w przeciwnym razie. Linia 5. jeżeli znakDoKodu otwórz nawias okrągły wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≥ znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły i znakDoKodu otwórz nawias okrągły wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≤ znakDoKodu otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły dwukropek. Linia 6. wynik2 otwórz nawias kwadratowy i zamknij nawias kwadratowy ← kodDoZnaku otwórz nawias okrągły znakDoKodu otwórz nawias okrągły wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły plus otwórz nawias okrągły znakDoKodu otwórz nawias okrągły klucz otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias okrągły minus znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły. Linia 7. jeżeli znakDoKodu otwórz nawias okrągły wynik2 otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły zamknij nawias ostrokątny znakDoKodu otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły dwukropek. Linia 8. wynik2 otwórz nawias kwadratowy i zamknij nawias kwadratowy ← kodDoZnaku otwórz nawias okrągły znakDoKodu otwórz nawias okrągły wynik2 otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły minus 26 zamknij nawias okrągły. Linia 9. jeżeli j znak równości a minus 1 dwukropek. Linia 10. j ← 0. Linia 11. w przeciwnym razie. Linia 12. j ← j plus 1. Linia 13. w przeciwnym razie. Linia 14. wynik2 otwórz nawias kwadratowy i zamknij nawias kwadratowy ← wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy.

Gotowy program zapisany za pomocą pseudokodu wygląda następująco:

Linia 1. a ← 0. Linia 2. j ← 0. Linia 4. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek p minus 1 wykonuj dwukropek. Linia 5. jeżeli znakDoKodu otwórz nawias okrągły wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły znak równości znakDoKodu otwórz nawias okrągły apostrof kropka apostrof zamknij nawias okrągły dwukropek. Linia 6. przerwij pętlę. Linia 7. jeżeli znakDoKodu otwórz nawias okrągły wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≥ znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły i znakDoKodu otwórz nawias okrągły wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≤ znakDoKodu otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły dwukropek. Linia 8. kluczPomoc otwórz nawias kwadratowy j zamknij nawias kwadratowy ← wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 9. a ← a plus 1. Linia 10. j ← j plus 1. Linia 11. w przeciwnym razie dwukropek. Linia 12. a ← 0. Linia 13. j ← 0. Linia 15. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek a minus 1 wykonuj dwukropek. Linia 16. klucz otwórz nawias kwadratowy i zamknij nawias kwadratowy ← kluczPomoc otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 18. k ← 0. Linia 20. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek p minus 1 wykonuj dwukropek. Linia 21. jeżeli znakDoKodu otwórz nawias okrągły wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły znak równości znakDoKodu otwórz nawias okrągły apostrof asterysk apostrof zamknij nawias okrągły dwukropek. Linia 22. wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy ← identyfikator otwórz nawias kwadratowy k zamknij nawias kwadratowy. Linia 23. k ← k plus 1. Linia 25. l ← 0. Linia 27. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek p minus 1 wykonuj dwukropek. Linia 28. jeżeli znakDoKodu otwórz nawias okrągły wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły znak równości znakDoKodu otwórz nawias okrągły apostrof kropka apostrof zamknij nawias okrągły dwukropek. Linia 29. l ← i. Linia 30. przerwij pętlę. Linia 32. j ← 0. Linia 34. dla i znak równości 0 przecinek 1 przecinek 2 przecinek kropka kropka kropka przecinek p minus 1 wykonuj dwukropek. Linia 35. jeżeli i ≤ l dwukropek. Linia 36. wynik2 otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 37. w przeciwnym razie. Linia 38. jeżeli znakDoKodu otwórz nawias okrągły wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≥ znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły i znakDoKodu otwórz nawias okrągły wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły ≤ znakDoKodu otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły dwukropek. Linia 39. wynik2 otwórz nawias kwadratowy i zamknij nawias kwadratowy ← kodDoZnaku otwórz nawias okrągły znakDoKodu otwórz nawias okrągły wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły plus otwórz nawias okrągły znakDoKodu otwórz nawias okrągły klucz otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias okrągły minus znakDoKodu otwórz nawias okrągły apostrof A apostrof zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły. Linia 40. jeżeli znakDoKodu otwórz nawias okrągły wynik2 otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły zamknij nawias ostrokątny znakDoKodu otwórz nawias okrągły apostrof Z apostrof zamknij nawias okrągły dwukropek. Linia 41. wynik2 otwórz nawias kwadratowy i zamknij nawias kwadratowy ← kodDoZnaku otwórz nawias okrągły znakDoKodu otwórz nawias okrągły wynik2 otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły minus 26 zamknij nawias okrągły. Linia 42. jeżeli j znak równości a minus 1 dwukropek. Linia 43. j ← 0. Linia 44. w przeciwnym razie. Linia 45. j ← j plus 1. Linia 46. w przeciwnym razie. Linia 47. wynik2 otwórz nawias kwadratowy i zamknij nawias kwadratowy ← wzor otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 49. zapisz wynik2 do pliku cudzysłów wyniki1 podkreślnik 2 kropka txt cudzysłów.

Odpowiedź

Odpowiedź do zadania znajduje się w pliku wyniki1_2.txt:

Rxr9Z6CpjUIh0

Przycisk do pobrania pliku TXT z wynikiem zadania.

Plik TXT o rozmiarze 106.00 B w języku polskim

Słownik

ASCII
ASCII

sposób kodowania polegający na przypisaniu znakom z określonego zbioru (zawierającego między innymi liczby, cyfry i znaki przestankowe) liczb całkowitych z zakresu od 0 do 127

szyfrogram
szyfrogram

tekst powstały w procesie szyfrowania (zaszyfrowana wiadomość)

tekst jawny
tekst jawny

tekst przed operacją szyfrowania lub po operacji odszyfrowania; niezaszyfrowany tekst, który można swobodnie przeczytać