Sprawdź się
Zadanie 2.2
Pisarka uznała, że zakodowana wiadomość (z zadania 2.1) jest zbyt łatwa do odkodowania, gdyby dostała się w niepowołane ręce. W związku z tym zleciła swojemu asystentowi, aby zastosował bardziej skomplikowaną metodę utajnienia wiadomości.
Nowy sposób polega na tym, że przed zakodowaniem słowa za pomocą kodu Morse'a litery tego słowa szyfrowane są innymi znakami alfabetu łacińskiego zgodnie z szyfrem Cezara z określonym kluczem (więcej na temat szyfru Cezara znajdziesz w e‑materiale Szyfr CezaraPvJJ5fOYkSzyfr Cezara).
Zaszyfrujmy słowo KOT z użyciem klucza równego .
Zaszyfrowana litera K to litera N.
Zaszyfrowana litera O to litera R.
Zaszyfrowana litera T to litera X.
Słowo KOT zaszyfrowane szyfrem Cezara z kluczem równym ma postać NRX.
Następny krok to zakodowanie tego słowa kodem Morse'a.
Postać litery N to -. (kreska kropka).
Postać litery R to .-. (kropka kreska kropka).
Postać litery X to -..- (kreska kropka kropka kreska).
Zatem utajniony tekst ma następującą postać:
-. .-. -..-
W pliku TAJNE2.txt
znajduje się wierszy. W każdym wierszu znajduje się słowo (zapisane wyłącznie wielkimi literami) oraz klucz (oddzielony od słowa pojedynczym znakiem odstępu). Wszystkie słowa należy utajnić, stosując opisany algorytm.
W pliku ALFABET.txt
zapisano łańcuchów znaków składających się wyłącznie z kropek i kresek, które odpowiadają literom alfabetu łacińskiego (przy zachowaniu kolejności alfabetycznej, tj. od litery A do litery Z). Każdy łańcuch znaków znajduje się w osobnej linii.
Korzystając z wybranego języka (C++, Java lub Python) napisz program, który zakoduje słowa z pliku TAJNE2.txt
zgodnie z omówionym algorytmem. Każde zakodowane słowo ma zostać wypisane w osobnej linii. Odpowiedź zapisz do pliku TAJNE2_zakodowane.txt
.
Plik z danymi:
Przycisk do pobrania pliku TXT z treścią zadania. Pobierz załącznik
Przycisk do pobrania pliku TXT z treścią zadania. Pobierz załącznik
ALFABET.txt
Do oceny oddajesz:
plik
TAJNE2_zakodowane.txt
z odpowiedzią (łańcuchami znaków z plikuTAJNE2.txt
zaszyfrowanymi najpierw za pomocą szyfru Cezara z podanym kluczem, a następnie zakodowane za pomocą kodu Morse'a)plik(i) z komputerową realizacją zadania (kodem źródłowym programu)
Swoje rozwiązanie przetestuj dla danych zapisanych w testerkach. Wypisz otrzymane utajnione słowa, oddzielając każde z nich znakiem nowej linii.
Przykładowe rozwiązanie zadania:
#include <iostream>
#include <string>
#include <map>
using namespace std;
const int n = 37;
string slowa[n] = {"OKAZJA", "BLONDYNKA", "ISKRA", "MAJAKI", "DELFIN", "POLE", "KRATKA", "APTEKA", "BANK", "ANTYLOPA", "TERYTORIUM", "SZYFR", "ENIGMA", "POLITYK", "SZEF", "OSOBA", "POLICJA", "KOC", "WYWIAD", "PIES", "KROKODYL", "CIEN", "KELNER", "SAMOLOT", "HELIKOPTER", "SZCZYT", "PASMO", "SZLAK", "HAFT", "MARYNARKA", "GARSONKA", "STATEK", "WODA", "GAZ", "UWAGA", "ELOKWENCJA", "MAGIA"};
int klucze[n] = {12, 44, 3, 31, 12, 11, 44, 7, 8, 55, 4, 7, 9, 8, 77, 23, 12, 55, 34, 74, 26, 73, 22, 11, 19, 67, 41, 51, 48, 14, 23, 37, 34, 89, 87, 122, 22};
map<char, string> slownik =
{
{'A',".-"},
{'B',"-..."},
{'C',"-.-."},
{'D',"-.."},
{'E',"."},
{'F',"..-."},
{'G',"--."},
{'H',"...."},
{'I',".."},
{'J',".---"},
{'K',"-.-"},
{'L',".-.."},
{'M',"--"},
{'N',"-."},
{'O',"---"},
{'P',".--."},
{'Q',"--.-"},
{'R',".-."},
{'S',"..."},
{'T',"-"},
{'U',"..-"},
{'V',"...-"},
{'W',".--"},
{'X',"-..-"},
{'Y',"-.--"},
{'Z',"--.."}
};
int main(int argc, const char * argv[])
{
char litera = '0';
string zakodowane = "";
int przesuniecie = 0;
for (int i = 0; i < n; i++)
{
zakodowane = "";
if (klucze[i] > 26)
{
klucze[i] = klucze[i] % 26;
}
for (int j = 0; j < slowa[i].length(); j++)
{
przesuniecie = 0;
if ((int)slowa[i][j] + klucze[i] > 90)
{
przesuniecie = (int)slowa[i][j] + klucze[i] - 26;
}
else
{
przesuniecie = (int)slowa[i][j] + klucze[i];
}
litera = (char)przesuniecie;
zakodowane += slownik[litera];
zakodowane += " ";
}
cout << zakodowane << endl;
}
return 0;
}
Przykładowe rozwiązanie zadania:
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class MorseCoder {
static int n = 37;
static String[] slowa = {"OKAZJA", "BLONDYNKA", "ISKRA", "MAJAKI", "DELFIN", "POLE", "KRATKA", "APTEKA", "BANK", "ANTYLOPA", "TERYTORIUM", "SZYFR", "ENIGMA", "POLITYK", "SZEF", "OSOBA", "POLICJA", "KOC", "WYWIAD", "PIES", "KROKODYL", "CIEN", "KELNER", "SAMOLOT", "HELIKOPTER", "SZCZYT", "PASMO", "SZLAK", "HAFT", "MARYNARKA", "GARSONKA", "STATEK", "WODA", "GAZ", "UWAGA", "ELOKWENCJA", "MAGIA"};
static int[] klucze = {12, 44, 3, 31, 12, 11, 44, 7, 8, 55, 4, 7, 9, 8, 77, 23, 12, 55, 34,
74, 26, 73, 22, 11, 19, 67, 41, 51, 48, 14, 23, 37, 34, 89, 87, 122, 22};
static Map<Character, String> slownik = Stream.of(new Object[][]
{
{'A',".-"},
{'B',"-..."},
{'C',"-.-."},
{'D',"-.."},
{'E',"."},
{'F',"..-."},
{'G',"--."},
{'H',"...."},
{'I',".."},
{'J',".---"},
{'K',"-.-"},
{'L',".-.."},
{'M',"--"},
{'N',"-."},
{'O',"---"},
{'P',".--."},
{'Q',"--.-"},
{'R',".-."},
{'S',"..."},
{'T',"-"},
{'U',"..-"},
{'V',"...-"},
{'W',".--"},
{'X',"-..-"},
{'Y',"-.--"},
{'Z',"--.."}
}).collect(Collectors.toMap(e -> (char)e[0], e->(String)e[1]));
public static void main(String[] args) {
char litera = '0';
StringBuilder zakodowane;
int przesuniecie = 0;
for(int i = 0; i < n; i++) {
zakodowane = new StringBuilder();
if (klucze[i] > 26) {
klucze[i] = klucze[i] % 26;
}
for (int j = 0; j < slowa[i].length(); j++) {
if ((int)slowa[i].charAt(j) + klucze[i] > 90) {
przesuniecie = (int)slowa[i].charAt(j) + klucze[i] - 26;
} else {
przesuniecie = (int)slowa[i].charAt(j) + klucze[i];
}
litera = (char)przesuniecie;
zakodowane.append(slownik.get(litera));
zakodowane.append(" ");
}
System.out.println(zakodowane.toString());
}
}
}
Przykładowe rozwiązanie zadania:
n = 37
slowa = ["OKAZJA", "BLONDYNKA", "ISKRA", "MAJAKI", "DELFIN", "POLE", "KRATKA", "APTEKA", "BANK", "ANTYLOPA", "TERYTORIUM", "SZYFR", "ENIGMA", "POLITYK", "SZEF", "OSOBA", "POLICJA", "KOC", "WYWIAD", "PIES", "KROKODYL", "CIEN", "KELNER", "SAMOLOT", "HELIKOPTER", "SZCZYT", "PASMO", "SZLAK", "HAFT", "MARYNARKA", "GARSONKA", "STATEK", "WODA", "GAZ", "UWAGA", "ELOKWENCJA", "MAGIA"]
klucze = [12, 44, 3, 31, 12, 11, 44, 7, 8, 55, 4, 7, 9, 8, 77, 23, 12, 55, 34, 74, 26, 73, 22, 11, 19, 67, 41, 51, 48, 14, 23, 37, 34, 89, 87, 122, 22]
slownik = {
'A': ".-",
'B': "-...",
'C': "-.-.",
'D': "-..",
'E': ".",
'F': "..-.",
'G': "--.",
'H': "....",
'I': "..",
'J': ".---",
'K': "-.-",
'L': ".-..",
'M': "--",
'N': "-.",
'O': "---",
'P': ".--.",
'Q': "--.-",
'R': ".-.",
'S': "...",
'T': "-",
'U': "..-",
'V': "...-",
'W': ".--",
'X': "-..-",
'Y': "-.--",
'Z': "--..",
}
i = 0
for slowo in slowa:
zakodowane = ""
if klucze[i] > 26:
klucze[i] = klucze[i] % 26
for litera in slowo:
przesuniecie = 0;
if ord(litera) + klucze[i] > 90:
przesuniecie = ord(litera) + klucze[i] - 26
else:
przesuniecie = ord(litera) + klucze[i]
litera = chr(przesuniecie)
zakodowane += slownik[litera]
zakodowane += " "
print(zakodowane)
i = i + 1
Odpowiedź
Poprawna odpowiedź do zadania dla danych z pliku:
Przycisk do pobrania pliku TXT z odpowiedzią do zadania. Pobierz załącznik
TAJNE2_zakodowane.txt