MAZOWIECKI URZĄD SZYFRÓW posługuje się (do zapisywania tajnych informacji) alfabetem składającym się tylko z 16 znaków - małych liter od a do p. W celu usprawnienia przetwarzania dokumentów utworzył własny system cyfrowego kodowania znaków, tzw. kod MKI, w którym każdej literze odpowiada czterobitowe słowo (patrz tabela).
Ustalano następujący system szyfrowania znaków, słów oraz zdań:
Znak | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p |
Kod | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
Zdefiniuj funkcję SZYFR :zd, której wynikiem dla dowolnego zdanie utworzonego ze słów w alfabecie od a do p jest szyfr tego zdania utworzony zgodnie z ustalonymi wyżej zasadami.
Przykładowe wyniki:
SZYFR [ala nie ela] | powinno dać wynik [ana lbc cna] |
---|---|
SZYFR [moja lalka] | powinno dać wynik [dhja nanfa] |
Jak można zuważyć każda kolejna litera odpowiada jej pozycji zapisanej przy pomocy kodu binarnego. Przedstawione poniżej rozwiązanie omija to poprzez zadeklarowanie dwóch list, które odpowiadają dwóm wierszom tabeli. Należy jednak pamiętać, że takie rozwiązanie choć szybsze w napisaniu to okazuje się mało praktyczne jeśli zmieni się polecenie zadania.
Zapamiętaj (2.) kolejne litery oraz (5.) ich binarną reprezentację. (4.) Przygotuj listę wynikową. (5.) Dla każdego słowa: (6.) pobierz zamieniany element ze zdania, a następnie (7.) dla każdej litery w słowie: (8.) znajdź jego kod, a następnie (9.) zastąp kolejną literą odpowiednim elementem. (11.) Zmodyfikowane słowo dopisz na listę wynikową. (13.) Zwróć wynik.
Nietrudno zauważyć, że listy :l1 i :l2 są niepotrzebne. Wystarczy dodatkowo funkcja, która zwróci numer pozycji pobranego znaku w alfabecie oraz zwróci k-ty znak. W celu uniknięcia korzystania z listy :l2 należałoby napisać funkcje, która zamienia liczbę na postać binarną i dekoduje postać binarną.
Dwie przekątne kwadratu dzielą go na cztery ćwiartki. Zamalowując różne kombinacje tych ćwiartek możemy otrzymać 16 różnych wzorów, których możemy używać jako wizualnych kodów flagowych 16 elementowego alfabetu od a do p. Ustalamy następujący system wizualnego kodowania liter alfabetu od a do p w postaci flag.
Kodem flagowym słowa będzie odpowiednia sekwencja kodów flagowych kolejnych znaków. Kodem flagowym zdania będzie sekwencja, umieszczonych kolejno jeden pod drugim i wyrównanych do lewego brzegu kodów słów tworzących zdanie.
Zdefiniuj procedurę FLAGI :zd, która dla dowolnego danego zdania :zd wyświetla na środku ekranu jego kod na tle szarego prostokąta. Zakładamy, że dane zdanie będzie się składać z co najmniej jednego i co najwyżej ośmiu słów, a każde słowo z co najmniej jednej i co najwyżej 12 liter z alfabetu od a do p.
Poniższy rysunek przedstawia wynik wywołania FLAGI [ola ma domek].
Na poczatek warto przyjrzeć się użytym znaczkom do reprezentacji poszczególnych liter. Warto zauważyć, że jeśli podzieli się kwadrat na ćwiartki i odczyta się kod zaczynając od górnej ćwiartki dookoła w prawo to powstanie np. dla litery d: ccbb (c - czarny, b - biały). Jeśli teraz zamienić białe na 0, a czarne na 1 to otrzymamy 1100 to jest to binarny zapis wstecz numeru pozycji litery f. Warto zauważyć, że w takim razie można napisać funkcję FLAGI_kwa, która przyjmie argument :s, który określi kod obrazka. W ten sposób łatwiej będzie przechować jak ma wyglądać rysunek poszczególnego znaku.
(1.) Ze względu na różną wielkość obrazka prócz kodu :s procedura przyjmuje argument :a, który określa szerokość i wysokość elementu. (2.) Dla każdego 0 oraz 1. (Oczywiście prawidłowy kod ma 4 znaki i składa się z 0 i / lub 1.) (3.) Ustal odpowiedni kolor pisaka i (4.) malowania. (5. - 13.) Narysuj odpowiednią ćwiartkę i (14.) przejdź do rysowania następnej.
Procedura FLAGI można podzielić na trzy etapy: wyliczenie rozmiaru oraz przygotowanie list wartości. Następnie rysowanie składa się z narysowania tła, a następnie poszczególnych linijek flagi.
(2. - 3.) Maksymalne wymiary rysunku oraz (4.) użyty alfabet i (5.) zakodowane reprezentacje graficzne znaków. (i-tej literze odpowiada i-ty kod.) (6.) Zadeklaruj zmienną :max na 0 i (8. - 12.) znajdź nadłuższe słowo i zapamiętaj jego długość. (7.) Ustal margines między kwadratami na 4. Wyliczyć szerokość kwadratu na podstawie (13.) szerokości oraz (14.) wysokości. (15. - 19.) Jako ostateczny rozmiar przyjmij mniejszą z wyliczonych wartości. Dopiero na podstawie szerokosci kwadratu wylicz (20.) wysokość i (21.) szerokość tła.
(22. - 27.) Przejdź do lewego, dolnego rohu szarego tła i (28. - 37.) je narysuj.
(38. - 43.) Z lewego, dolnego rogu rysunku przejdź do lewego, dolnego rogu lewego, dolnego kwadratu. Następnie: (44.) Dla każdego słowa: (45.) pobierz je i przechowaj w zmiennej :s. (46.) Dla każdej litery w pobranym słowie: (47.) narysuj kwadrat i (48. - 52.) przejdź do lewego, dolnego rogu następnego rysowanego kwadratu. (54. - 59.) Po narysowaniu całej lini wróć na początek i przejdź jeden wiersz wyżej.
Listy :l1 i :l2 tak jak w zadaniu 1 nie są potrzebne, ale znacząco przyśpieszają pisanie kodu. Listy te można zastąpić specjalnymi funkcjami.
Jeśli mamy po jednym odważniku o masie 1 kg, 3 kg, 9 kg itd. aż do 3n kg, to możemy na wadze szalkowej odważyć każdy ciężar, którego masa w kg jest liczbą całkowitą z zakresu od 0 do 1 + 3 + .. + 3n i to w dodatku tylko w jeden sposób.
Na przykład, żeby zrównoważyć ciężar 11 kg, trzeba na jednej szali położyć dany ciężar i odważnik 1 kg., a na drugiej szali - odważniki 9 kg i 3 kg.
Zdefiniuj funkcję ZRW :mc, która dla danej masy ciężaru, będącej liczbą całkowitą dodatnią, wyznacza odważniki, które trzeba położyć na szalach wagi, żeby zrównoważyć dany ciężar.Wynikiem funkcji ma być dwuelementowa lista. Pierwszym jej elementem powinna być lista mas odważników, które należy położyć na jednej szali z odmierzanym ciężarem, a drugim elementem - lista mas odważników, które należy położyć na przeciwnej szali. Obie te listy powinny być uporządkowane malejąco.
Oto przykładowe wyniki:
ZRW 101 | powinno dać wynik [[9 1][81 27 3]] |
---|---|
ZRW 282 | powinno dać wynik [[][243 27 9 3]] |
ZRW 3295 | powinno dać wynik [[2187 729 243 81 27][6561 1]] |
ZRW 243 | powinno dać wynik [[][243]] |
Rozwiązanie niedostępne