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