Etap II turnieju

Transkrypt

Etap II turnieju
Uniwersytet Kazimierza Wielkiego w Bydgoszczy
Zespół Szkół nr 5 Mistrzostwa Sportowego
XV Liceum Ogólnokształcące w Bydgoszczy
XIV FORDOŃSKI TURNIEJ
WIEDZY ALGORYTMICZNEJ
etap 2
Bydgoszcz, 25 kwietnia 2015
Fordoński Turniej Wiedzy Algorytmicznej – etap 2
Zadanie 1 – Kompresowanie i dekompresowanie danych metodą LZW
8pkt
(kategoria: szkoły gimnazjalne i szkoły ponadgimnazjalne)
Źródło: http://pl.wikipedia.org/wiki/LZW
Jedną z metod kompresji danych jest strumieniowa i bezstratna metoda LZW (od nazwiska twórcy metody:
Lempel-Ziv-Welch) należąca do metod słownikowych. Jest ona modyfikacją metody LZ78. Stosując tę metodę
można uzyskać nawet 80% zmniejszenie wielkości pliku graficznego, bez utraty jego jakości. Metoda ta
uważana jest za jedną z najlepszych metod bezstratnych, dlatego znalazła zastosowanie w wielu programach
kompresujących, jak WinZIP czy WinRAR oraz formatach plików graficznych takich jak PDF, GIF czy TIFF. LZW
było przez pewien czas algorytmem objętym patentem, co było przyczyną podjęcia prac nad nowym
algorytmem kompresji obrazów, które zaowocowały powstaniem formatu PNG.
Algorytm kompresji:
W pojedynczym kroku algorytmu wyszukiwany jest w słowniku najdłuższy ciąg niezakodowanych jeszcze
danych. Na wyjście wypisywany jest wówczas kod związany z tym słowem, zaś do słownika dodawana nowa
pozycja: łańcuch składający się ze słowa i pierwszej niedopasowanej litery.
Algorytm przebiega następująco:
1. Wypełnij słownik alfabetem źródła informacji.
2. c := pierwszy symbol wejściowy
3. Dopóki są dane na wejściu:
o Wczytaj znak s.
o Jeżeli ciąg c + s znajduje się w słowniku, przedłuż ciąg c, tj. c := c + s
o Jeśli ciągu c + s nie ma w słowniku, wówczas:
 wypisz kod dla c (c znajduje się w słowniku)
 dodaj ciąg c + s do słownika
 przypisz c := s.
4. Na końcu wypisz na wyjście kod ciągu symbolu c.
O efektywności kompresji w dość dużym stopniu decyduje sposób zapisu kodów (liczb).
Algorytm dekompresji:
Algorytm dekompresji jest nieco bardziej złożony, bowiem dekoder musi wykryć przypadki ciągów scscs (które
nie znajdują się w słowniku), gdzie ciąg sc jest już w słowniku, a podciąg c jest dowolny, być może także pusty.
1. Wypełnij słownik alfabetem źródła informacji.
2. pk := pierwszy kod skompresowanych danych
3. Wypisz na wyjście ciąg związany z kodem pk, tj. słownik[pk]
4. Dopóki są jeszcze jakieś słowa kodu:
o Wczytaj kod k
o pc := słownik[pk] – ciąg skojarzony z poprzednim kodem
o Jeśli słowo k jest w słowniku, dodaj do słownika ciąg (pc + pierwszy symbol ciągu słownik[k]), a na
wyjście wypisz cały ciąg słownik[k].
o W przeciwnym razie (przypadek scscs) dodaj do słownika ciąg (pc + pierwszy symbol pc) i tenże ciąg
wypisz na wyjście.
o pk := k
Twoje zadanie polega na napisaniu programu kodującego i dekodującego metodą LZW oraz odkodowanie
danych z pliku „zakodowane.txt” i zakodowanie ciągów znaków z pliku „do_zakodowania.txt”. Dane
zakodowane i odkodowane powinny zostać wyświetlone na ekranie monitora oraz zapisane do pliku
„Zadanie_1.txt”.
Dla przykładu po zakodowaniu ciągu składającego się z 24 znaków: "abccd_abccd_acd_acd_acd_" otrzymamy
dane składające się z 15 indeksów: 97 98 99 99 100 95 256 258 260 97 259 261 266 265 260. Indeksy
oczywiście uzależnione są od tworzonego przez algorytm wstępnego słownika. Ważne jest więc, aby algorytm
szyfrujący i deszyfrujący tworzyły identyczne słowniki. Załóżmy, dla ułatwienia, że nasz program będzie na
wstępie automatycznie generował słownik zawierający kolejne znaki ASCII o wartościach od 0 do 255. Pierwszy
ciąg znaków wygenerowany za pomocą algorytmu LZW zapisany więc zostanie pod adresem 256.
2
Edycja XIV – kwiecień 2015
Zadanie 2 – ENIGMA
(kategoria: szkoły gimnazjalne i szkoły ponadgimnazjalne)
10pkt
Źródło: http://edu.i-lo.tarnow.pl/inf/alg/001_search/0066.php
W związku z przypadającą w 2015 roku 110. rocznicą urodzin rodowitego bydgoszczanina Mariana Rejewskiego
Rada Miasta Bydgoszczy Uchwałą Nr LXII/1291/14 z dnia 24 września 2014 roku podjęła decyzję
o ustanowieniu roku 2015 – Rokiem Mariana Rejewskiego. My również chcemy włączyć się w upamiętnienie
Mariana Rejewskiego, polskiego matematyka i kryptologa, który w 1932 roku złamał szyfr Enigmy,
najważniejszej maszyny szyfrującej używanej przez hitlerowskie Niemcy. Sukces Rejewskiego
i współpracujących z nim kryptologów z Biura Szyfrów, między innymi Henryka Zygalskiego i Jerzego
Różyckiego, umożliwił odczytywanie przez Brytyjczyków zaszyfrowanej korespondencji niemieckiej podczas
II wojny światowej przyczyniając się do wygrania wojny przez aliantów.
Enigma, podobnie jak szyfr Cezara, wykorzystywała zasadę klasycznego szyfru podstawieniowego. Polega on
na zastępowaniu liter tekstu jawnego innymi literami według określonej reguły. Dla przykładu, zapiszmy jeden
wiersz kolejnych liter alfabetu angielskiego, a pod nim drugi wiersz tych samych liter, ale losowo
wymieszanych. Otrzymujemy w ten sposób tabelkę szyfrowania.
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
W M X O F Z K T I G V A B L D N S C H P R U E Q J Y
Aby zaszyfrować tekst, podmieniamy literki z górnego wiersza odpowiadającymi im literami wiersza dolnego,
np. słowo KONKURS po zaszyfrowaniu będzie miało postać VDLVRCH. Taki szyfr można jednak szybko złamać
wykorzystując np. fakt, że te same znaki zastępowane są takimi samymi odpowiednikami. Przykładem może
być słowo MAMA, które po zaszyfrowaniu będzie miało postać BWBW, czy TATA postać PWPW. Zwińmy teraz
tabelkę szyfrowania w pierścień, w którym za literą Z będą litery A, B, C, …, a przed literą A litery …X, Y, Z.
… X Y Z 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 A B C …
… Q J Y W M X O F Z K T I G V A B L D N S C H P R U E Q J Y W M X …
KROK 4
KROK 3
KROK 2
KROK 1
Umieśćmy teraz nad naszym pierścieniem szyfrującym kolejne nieruchome litery alfabetu od A do Z, natomiast
sam pierścień obracajmy o jedną pozycję w lewo po zakodowaniu kolejnego znaku szyfrowanego słowa. Dla
przykładu słowo MAMA po zaszyfrowaniu będzie miało postać BMDO:
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
… X Y Z 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 A B C …
… Q J Y W M X O F Z K T I G V A B L D N S C H P R U E Q J Y W M X …
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
… Y Z 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 A B C X …
… J Y W M X O F Z K T I G V A B L D N S C H P R U E Q J Y W M X Q …
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
… Z 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 A B C X Y …
… Y W M X O F Z K T I G V A B L D N S C H P R U E Q J Y W M X Q J …
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
… 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 A B C X Y Z …
… W M X O F Z K T I G V A B L D N S C H P R U E Q J Y W M X Q J Y …
Jeden ruchomy pierścień szyfrujący daje 26 różnych alfabetów podmieniających. Jeśli jednak dodamy drugi
pierścień szyfrujący (wg innego szyfru podstawieniowego), na którego wejście wprowadzimy wyjście
z pierwszego pierścienia, to liczba kombinacji alfabetów wzrośnie do 676 (26 × 26) alfabetów.
Drugi pierścień wykonuje obrót o jedną pozycję, gdy pierścień pierwszy wykona pełen obrót – podobnie jak
w mechanizmie licznikowym. Wtedy otrzymamy wszystkie kombinacje alfabetów pierwszego pierścienia
3
Fordoński Turniej Wiedzy Algorytmicznej – etap 2
z alfabetami pierścienia drugiego. Dodanie trzeciego pierścienia szyfrującego zwiększy liczbę szyfrów do 17 576
(26 × 26 × 26). Zgodnie z taką zasadą szyfrowania zbudowana była maszyna Enigma.
Elementem szyfrującym w maszynie Enigma było 10 różnych pierścieni szyfrujących wyposażonych z obu stron
w kontakty elektryczne. Na końcu układu pierścieni znajdował się tzw. bęben odwracający, który posiadał
kontakty tylko po jednej stronie. Kontakty bębna odwracającego połączone były w pary za pomocą przewodów
elektrycznych. Zatem prąd wchodzący do jednego kontaktu pojawiał się na innym kontakcie bębna
odwracającego i wracał z powrotem do trzeciego pierścienia szyfrującego, a stąd dalej poprzez pierścienie dwa
i jeden wychodził na kontakt wejściowy pierwszego pierścienia, skąd dalej zapalał żarówkę podświetlającą
literkę na blacie maszyny Enigma. Dzięki zastosowaniu bębna odwracającego szyfr Enigmy stał się szyfrem
symetrycznym, zatem ten sam klucz (wstępne położenie pierścieni szyfrujących) można stosować zarówno do
szyfrowania jak i do deszyfrowania. W maszynach Enigma stosowano 10 różnych pierścieni szyfrujących.
Poniższa tabela przedstawia ich sposoby szyfrowania.
Litery wejściowe
Pierścień I
Pierścień II
Pierścień III
Pierścień IV
Pierścień V
Pierścień VI
Pierścień VII
Pierścień VIII
Pierścień Beta
Pierścień Gamma
ABCDEFGHIJKLMNOPQRSTUVWXYZ
EKMFLGDQVZNTOWYHXUSPAIBRCJ
AJDKSIRUXBLHWTMCQGZNPYFVOE
BDFHJLCPRTXVZNYEIWGAKMUSQO
ESOVPZJAYQUIRHXLNFTGKDCMWB
VZBRGITYUPSDNHLXAWMJQOFECK
JPGVOUMFYQBENHZRDKASXLICTW
NZJHGRCXMYSWBOUFAIVLPEKQDT
FKQHTLXOCBJSPDZRAMEWNIUYGV
LEYJVCNIXWPBQMDRTAKZGFUHOS
FSOKANUERHMBTIYCWLQPZXVGJD
Na obwodzie każdego pierścienia umieszczony był karb, dzięki któremu ruch pierścienia przenosił się w
odpowiednim miejscu do pierścienia następnego. W celu utrudnienia identyfikacji pierścieni szyfrujących przez
przeciwnika, karby umieszczano w różnych miejscach pierścieni. Gdy pierwszy pierścień wykonał pełny obrót,
to karb na jego obwodzie powodował zazębienie się specjalnej zapadki obracającej następny pierścień o 1/26
obwodu. W drugim pierścieniu identyczny układ obracał trzeci pierścień, gdy pierścień drugi wykonał pełny
obrót. W poniższej tabeli przedstawiono położenie karbu w pierścieniach szyfrujących Enigmy.
Pierścień I
przy R
Pierścień II
przy F
Pierścień III
przy W
Pierścień IV
przy K
Pierścień V
przy A
Pierścienie VI, VII oraz VIII przy A i przy N
Załóżmy, iż pierwszym od prawej pierścieniem szyfrującym był pierścień I. Otóż gdy w okienku Enigmy pojawiła
się dla tego pierścienia literka R, to obrót pierścienia I powodował również obrót sąsiadującego po lewej
pierścienia szyfrującego. W nowszych Enigmach punkt przeniesienia można było obracać na obwodzie
pierścienia, co dodatkowo komplikowało system szyfrowania. W poniższej tabelce zebrane zostały parametry
bębnów odwracających, używanych w Armii Niemieckiej. Bębny były nieruchome, nie posiadały zatem
mechanizmu przenoszenia napędu:
Zamiany liter wprowadzane przez bębny odwracające
Litery wejściowe 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
YRUHQSLDPXNGOKMIEBFZCWVJAT
Bęben B
FVPJIAOYEDRZXWGCTKUQSBNMHL
Bęben C
reflektor B Dünn E N K Q A U Y W J I C O P B L M D X Z V F T H R G S
reflektor C Dünn R D O B J N T K V E H M L F C W Z A X G Y I P S U Q
Zwróć uwagę, iż bębny odwracające szyfrują w sposób symetryczny. Np. dla bębna B litera A przechodzi w Y
oraz litera Y przechodzi w A. Oprócz pierścieni maszyny Enigma posiadały tzw. łącznicę wtyczkową. Za pomocą
przewodów z wtyczkami łącznica pozwalała na zamianę ze sobą par liter docierających z klawiatury Enigmy do
pierścieni szyfrujących. Gdy połączymy litery A z J oraz S z O, to po naciśnięciu na klawiaturze np. klawisza A, do
pierścieni dotrze sygnał litery J. Podobnie gdy naciśniemy klawisz J, do pierścieni szyfrujących dotrze sygnał na
kontakt A. Również prąd wychodzący kontaktem A spowoduje zapalenie się lampki J i na odwrót. W Enigmie
4
Edycja XIV – kwiecień 2015
stosowano 10 przewodów z wtyczkami, które umożliwiały dokonanie zamian 20 liter. Dzięki łącznicy ilość
możliwych do uzyskania kombinacji szyfrów osiągała astronomiczną liczbę 15 × 10 18. Niemcy uważali, iż kod
Enigmy jest niemożliwy do złamania. Na szczęście dla nas mylili się, co w efekcie kosztowało Niemcy przegranie
wojny.
Twoje zadanie polega na napisaniu programu odszyfrowywującego zapisane w pliku tekstowym „szyfry.txt”
szyfrogramy. Znaki spacji zastąpione zostały znakiem X, podobnie jak robili to Niemcy w czasie II wojny
światowej. Dane w pliku zapisane są w kolejnych pięciu wierszach, których każdy ma postać:
„kolejność pierścieni szyfrujących” „ustawienia początkowe pierścieni” „stan połączeń łącznicy wtyczkowej” „szyfrogram”
Program powinien umożliwić dobranie zespołu trzech pierścieni szyfrujących, spośród pierścieni od I do V
rzeczywistej Enigmy. Zachowamy tutaj sposób szyfrowania tych pierścieni. Pierścienie będą współpracowały z
bębnem odwracającym typu B. Ten element nie będzie wymienny. W celu uproszczenia założymy również, iż
punkty przeniesień dla poszczególnych pierścieni szyfrujących są stałe, zgodne z podaną wcześniej tabelą.
Układ pierścieni będzie definiowany 3 cyfrową liczbą dziesiętną. Np. 351 oznacza, licząc od lewej do prawej,
kolejno pierścień III, pierścień V oraz pierścień I. Dane są wprowadzane do pierścienia I, następnie przechodzą
do pierścienia V i III, odbijają się w bębnie odwracającym i wracają poprzez pierścień III, V i I.
Stan początkowy pierścieni (czyli to, co widać w okienkach szyfrowych Enigmy) określany będzie trzyliterowym
tekstem. Np. FAD oznacza (przy powyższym układzie pierścieni szyfrujących), iż pierścień III należy ustawić na
F, pierścień V na A i pierścień I na D.
Dodatkowo stan łącznicy wtyczkowej będziemy definiowali tekstem złożonym z par liter, które mają być
zamienione miejscami. Np. tekst AXDSFE oznacza, iż zostaną ze sobą zamienione następujące litery: A z X, D z S
i F z E. Zamiana liter występuje w dwóch miejscach:
 Przy wprowadzeniu znaku przed podaniem go na układ pierścieni szyfrujących, czyli np. literka A
zostanie na wejściu zastąpiona literką X i na pierwszy pierścień szyfrujący trafi znak X, a nie znak A.
 Przy wyprowadzaniu znaku z pierścieni szyfrujących na wyjście, czyli np. znak D zostanie zastąpiony
znakiem S i ten znak trafi na wyjście.
Dla przykładu, załóżmy że nasza ENIGMA ustawiona jest następująco:
 Kolejność pierścieni szyfrujących: 123
 Ustawienia początkowe pierścieni: AAA
 Stan połączeń łącznicy wtyczkowej: brak
 Szyfrogram: pojedyncza litera „F”
 Tekst zaszyfrowany: pojedyncza litera „T”.
Litery wejściowe
ABCDEFGHIJKLMNOPQRSTUVWXYZ
i wyjściowe
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Łącznica
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Pierścień III
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Pierścień II
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Pierścień I
Bęben B
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
5
Fordoński Turniej Wiedzy Algorytmicznej – etap 2
W kolejnym przykładzie, załóżmy że nasza ENIGMA ustawiona jest następująco:
 Kolejność pierścieni szyfrujących: 123
 Ustawienia początkowe pierścieni: AFA
 Stan połączeń łącznicy wtyczkowej: ADJM
 Szyfrogram: pojedyncza litera „F”
 Tekst zaszyfrowany: pojedyncza litera „M”.
Litery wejściowe
ABCDEFGHIJKLMNOPQRSTUVWXYZ
i wyjściowe
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Łącznica
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Pierścień III
ABCDEFGHIJKLMNOPQRSTUVWXYZ
FGHIJKLMNOPQRSTUVWXYZABCDE
Pierścień II
FGHIJKLMNOPQRSTUVWXYZABCDE
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Pierścień I
Bęben B
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Zadanie 3 – Dodawanie i odejmowanie
(kategoria: szkoły gimnazjalne i szkoły ponadgimnazjalne)
7pkt
Do roku 1975 za pierwszy komputer na świecie powszechnie uważany był komputer ENIAC skonstruowany
w latach 1943-1945 przez J.P. Eckerta i J.W. Mauchly'ego na Uniwersytecie Pensylwanii w USA. ENIAC miał
masę ponad 27 ton, zawierał blisko 18 tys. lamp elektronowych i zajmował powierzchnię ok. 140 metrów
kwadratowych. Nie miał pamięci operacyjnej i początkowo programowany był przez przełączanie wtyków
kablowych, później za pomocą kart perforowanych. Wprawdzie dziś uważa się, że już przed nim na miano
komputera zasłużyły maszyny Z1 oraz Z3 skonstruowane przez niemieckiego inżyniera Konrada Zusego,
angielskie maszyny kryptograficzne Colossus, oraz ABC Atanasoffa, to jednak powszechnie uznaje się, iż to
ENIAC rozpoczął erę postępu w rozwoju techniki obliczeniowej.
Dzisiejsze komputery są znacznie mniejsze i mobilne, szybsze, łatwiejsze w programowaniu oraz powszechnie
wykorzystywane. Mają jednak pewne ograniczenia, do których należy między innymi wielkość liczb, na których
możemy wykonywać obliczenia. Można jednak obejść ten problem.
Twoje zadanie polega na napisaniu programu umożliwiającego dodawanie i odejmowanie liczb naturalnych
składających się z bardzo dużej ilości cyfr, np.
6
+
5641515644156316354786511218841515454121635465310320384845315148561756456456455200215
87741515486561212031456032030616562631203064878451215654655211521231345345315212212
5729257159642877566817967250872132016752838530188771600499970360082987801801770412427
–
5641515544156316354786511318841515454121635465310320384845315148561756456456455200215
87741515486561212031456032030616562631203064878451215654655211521231345345315212212
5553774028669755142755055286810898891490432400431869169190659937040525111111139988003
Edycja XIV – kwiecień 2015
Zadanie 4a – Saper
(kategoria: szkoły gimnazjalne)
5pkt
Saper (tytuł oryginalny Minesweeper) to klasyczna jednoosobowa gra
komputerowa napisana w 1981 roku przez Roberta Donnera. Polega na
odkrywaniu na planszy poszczególnych pól w taki sposób, aby nie natrafić na
minę. Na każdym z odkrytych pól napisana jest liczba min, które bezpośrednio
stykają się z danym polem (od zera do ośmiu). Jeśli oznaczymy dane pole flagą,
jest ono zabezpieczone przed odsłonięciem, dzięki czemu przez przypadek nie
odsłonimy miny.
Twoje zadanie polega na losowym wygenerowaniu 20 min (możesz oznaczyć je
wielką literą „X”) na planszy o rozmiarze 10 x 10 oraz uzupełnieniu pozostałych
pustych pół liczbą informującą o ilości min znajdujących się w ich bezpośrednim
sąsiedztwie. Przykład takiej tablicy przedstawia załączona po prawej stronie grafika.
Zadanie 4b – 8 hetmanów
(kategoria: szkoły ponadgimnazjalne)
5pkt
Wśród figur szachowych znajduje się królowa,
zwana hetmanem. Ustawiona na szachownicy
atakuje wszystkie pola w poziomie, w pionie i po
skosie. Problem 8 hetmanów (sformułowany
przez J.C. Gaussa w 1850 roku) polega na
ustawieniu na szachownicy tychże figur tak, aby
żadna z nich nie mogła zbić innej. Po prawej
stronie znajduje się przykład jednego z 92
możliwych rozwiązań.
Twoje zadanie polega na napisaniu programu
generującego na ekranie 92 szachownice przedstawiające wszystkie możliwe rozwiązania algorytmu.
Dla czarnego pola szachowego wykorzystaj znak o kodzie ASCII 176, a dla pola białego znak ASCII o kodzie 177.
Pola na których stoją królowe oznacz wielką literą „X”, podobnie jak na przedstawionym przykładzie.
BRUDNOPIS
7

Podobne dokumenty