Zdefiniuj procedurę DOMKI :liczba rysującą na ekranie ciąg domków. Kolejne domki mają wspólną ścianę i opisują kolejne cyfry nieujemnej całkowitoliczbowej danej :liczba. W zależności od wartości cyfry zamalowany jest odpowiedni trójkąt domku. Ponadto, dla cyfr parzystych, zamalowana jest na szaro lewa połowa dachu. Poniżej pokazane są domki odpowiadające poszczególnym cyfrom: 0, 1, 2, ..., 9:
Dla danej liczby każdy domek jest tej samej wielkości. Wszystkie domki powinny mieścić się na ekranie. Odległości skrajnych domków od, odpowiednio, lewej i prawej krawędzi ekranu, powinny być identyczne.Poniżej widać efekty wywołań, kolejno: DOMKI 1000, DOMKI 4545 oraz DOMKI 2468.
Przed rozpoczęciem pisania procedur warto zauważyć, że dla przypadków od 1 - 8 zamalowywane są kolejne trójkąty. Wyjątkiem jest tutaj przypadek 0 (nic zamalowanego) oraz 9 (zamalowany prawy górny trójkąt). Nie należy też pominąć faktu, że dla parzystych cyfr malowany jest górny lewy trójkąt na szaro. Wypisane zależności pozwolą napisać funkcję domek, która narysuje domek dla konkretnej cyfry :n i boku :a.
Jednak przed przystąpieniem do rysowania domku warto zauważyć, że jeśli dany trójkąt nie jest zamalowywany na konkretny kolor to jego kolor jest biały. Poniższa funkcja wybierzKolor przyjmuje trzy argumenty: :warunek oraz :kolor. Jej działanie polega na ustawienie koloru malowania na :kolor jeśli spełniony jest :warunek. W przeciwnym razie ustawiony jest kolor biały. Tego typu procedura pozwoli na uproszczenie ustawiania koloru danego elementu domku.
Procedura rysowania domku wyśrodkuje go w punkcie w którym zostanie rozpoczęta procedura i pozwoli na dostosowanie jego wielkości.
Rysowanie rozpocznij od (2.) wyśrodkowania żółwia pośrodku głównego kwadratu domku i (3. - 21.) narysuj wszystkie osiem trójkątów. W każdej iteracji (4.) wybierz kolor malowania na podstawie porównania numeru iteracji z :n oraz (5.) wybierz sposób rysowania trójkąta. Po zakończeniu iteracji (20.) obróć żółwia o 45°.
Żółw znajduje się teraz w takiej pozycji jak po linijce (2.). (22. - 23.) Przejdź do rysowania ostatnich dwóch trójkątów. (24.) Wybierz kolor malowania w zależności od parzystości :n i (25. - 29.) narysuj lewy trójkąt. (30. - 36.) Analogicznie dla prawego trójkąta. (37.) Wróć żółwiem do pozycji w której została rozpoczęta procedura i (38.) zresetuj kolor malowania.
Procedura DOMKI wyliczy najpierw krótszy bok trójkątów :a, a następnie narysuje domki dla każdej kolejnej cyfry w przekazanej liczbie :liczba.
Ustal (2.) szerokość i (3.) wysokość obszaru roboczego. (4.) Pobierz ile jest cyfr i (5.) oblicz długość :a. (6. - 9.) Jeśli rysunek miałby się nie zmieścić to dokonaj korekty boku.
(10. - 13.) Przejdź do pierwszego domu od prawej, ponieważ wybieranie kolejnych cyfr będzie odbywać się poprzez pobieranie ostatniej cyfry. (14.) Dla każdej kolejnej cyfry: (15.) Narysuj domek, (16. - 19.) przesuń żółwia na pozycję kolejnego domku i (20.) usuń ostatnią cyfrę liczby.
Zapewne wiele razy grałeś(aś) w kółko i krzyżyk. Klasyczna wersja tej gry polega na stawianiu naprzemian przez graczy, na planszy 3x3 pola, swojego znaku: krzyżyka lub kółka. Wygrywa ten z graczy, który jako pierwszy uzyska trzy swoje znaki w jednej linii: w poziomie, w pionie lub na skos. Nie wiemy, który z graczy rozpoczął grę, ani do którego gracza należy teraz ruch. Zakładamy, że na planszy nie ma sekwencji wygrywającej.
Zdefiniuj funkcję KK :gra, której daną jest dziewięcioliterowe słowo, opisujące układ krzyżyków i kółek na planszy - wierszami (tzn. trzy pierwsze znaki opisują pierwszy wiersz planszy, itd.). W danej :gra mogą występować tylko małe litery x, o oraz w. Oznaczają one: x - krzyżyk na danym polu, o - kółko na danym polu, zaś w oznacza wolne pole.
Wartością funkcji KK jest prawda, jeśli dana :gra opisuje możliwy układ w czasie gry, zaś fałsz - w przeciwnym przypadku.
KK "xwxoxooww | jest prawda |
---|---|
KK "xxwowowwo | jest prawda |
KK "xxoowooww | jest fałsz |
Zadanie choć może wydawać się trudne takie nie jest. Przede wszystkim należy zdać sobie sprawę, że jeśli w każdej turze każdy z graczy dokłada po jednym swoim symbolu to różnica ilości symboli x i o może wynosić 0 (tyle samo) lub 1 (jednego więcej). Jednak niewiadomo kto zaczął, dlatego niekoniecznie więcej może być x-ów, dlatego należy pobrać wartość absolutną z różnicy ilości symboli. Wtedy podany wcześniej warunek jest prawdziwy dla każdego prawidłowego ustawienia planszy.
Funkcja KK realizuje wygląda następująco:
(2. - 3.) Ustaw liczniki symboli na 0. (4.) Dla każdego pola: (5.) pobierz element i zapisz do zmiennej :e. W zależności od symbolu (6. - 8.) zwiększ licznik :x lub (9. - 11.) licznik :o. (13.) Na koniec zwróć wynik porównania wartości absolutnej różnicy liczników czy jest mniejszy, równy 1.
Zdefiniuj funkcję SZYFR :słowo :klucz1 :klucz2, której danymi są:
Wynikiem funkcji jest zakodowane :słowo.
Przyjęty sposób kodowania to modyfikacja jednego z najstarszych znanych systemów kodowania, przypisywanego Juliuszowi Cezarowi. Polega on na zastąpieniu każdej kolejnej litery - literą występującą w alfabecie o określoną liczbę pozycji dalej, cyklicznie (tj. jeśli wykraczamy poza alfabet, to kolejne litery bierzemy z początku alfabetu). W naszym zadaniu tę liczbę pozycji, oddzielnie dla samogłosek i spółgłosek, określają klucze szyfrowania funkcji SZYFR.
SZYFR "abrakadabra 1 2 | jest "bdtbmbfbdtb |
---|---|
SZYFR "axeyiz 2 4 | jest "cbgakd |
W celu uproszczenia kodu warto napisać funkcję szyfr_oblicz, która dla podanego znaku :znak oraz klucz :klucz obliczy znak po przesunięciu. W ten sposób kod funkcji SZYFR stanie się bardziej przejrzysty.
Funkcja szyfr_oblicz wygląda następująco:
Oczywiście funkcję można zapisać w postaci kolejnych instrukcji, ale to jest najkrótszy zapis, który powinno się napisać bez problemu jeśli wcześniej już się pisało kod dotyczący szyfrowania Cezara. Algorytm kolejno wykonuje następuje czynności:
Teraz funkcja SZYFR musi jedynie wywołać odpowiednio funkcję szyfr_obliczenia i otrzymaną wartość dołączyć do wyniku.
(2.) Przygotuj zmienną wynikową. (3.) Dla każdej litery: (4.) pobierz znak i zapisz do zmiennej :e. (5.) Jeśli :e jest samogłoską to (6.) szyfruj kluczem :klucz1. W przeciwnym razie (8.) kluczem :klucz2. Otrzymane znaki dopisz na koniec zmiennej :w. Na koniec (11.) zwróć zmienną :w.