Każdą liczbę naturalną można przedstawić jako sumę liczb 1, 2, 4 oraz 8. Opracowano następujący sposób graficznego kodowania liczb 1, 2, 4 oraz 8:
Zdefiniuj procedurę KODSUM :liczba, rysującą ciąg obrazków odpowiadający danej :liczba, przedstawionej jako najkrótsza (zawierająca najmniej składników) suma liczb 1, 2, 4 oraz 8. Obrazki reprezentujące kolejne kodowane składowe są uporządkowane od lewej do prawej - od tego który reprezentuje największą z liczb do tego który reprezentuje najmniejszą z nich. Co drugi obrazek jest obrócony o 180 stopni. Dana :liczba może przyjmować wartości z zakresu od 1 do 250. Oto przykładowe rysunki:
Rysunek powinien w całości mieścić się na ekranie, a długość odcinka stanowiącego dolną podstawę powstającej figury ma być równa 500.
Rozwiązanie zadania zostanie rozbite na 3 procedury. Pierwsza KODSUM_trojkat będzie rysować trójkąt o zadanym boku :a w taki sposób, że żółw znajdzie się w środku figury. Druga procedura KODSUM_el na podstawie zadanego boku :a oraz wartości :n zamaluje odpowiedni trójkąt na czarno. Z kolei główna procedura wyśrodkuje obrazek i przygotuje listę elementów do narysowania.
(2.) Wylicz wysokość w trójkącie równobocznym i (3. - 6.) cofnij się do dolnej podstawy trójkąta w prawy róg. (7. - 10.) Narysuj trójkąt i (11. - 14.) powróć do pozycji wyjściowej.
(2.) Wylicz wysokość w trójkącie równobocznym. (3. - 5.) Wykonaj korektę ustawienia elementu w szeregu i (6.) narysuj duży oraz (8.) mały trójkąt. W ten sposób narysowana zostaje siatka.
(10.) Na podstawie numeru zamalowanego trójkąt określ czy: (11. - 19.) zamalowany ma być jeden z narożnych trójkątów czy (21.) element w środku. (23. - 25.) Powróć tam skąd została rozpoczęta procedura.
Pierwszy etap polega na znalezieniu listy kolejnych elementów, które będą rysowane. W tym celu (2.) deklarowana jest pusta lista oraz dwie zmienne: (3.) :p - służy do przechowywania numeru elementu, który odpowiada (4.) aktualnej wartości zmiennej :wartosc - ta z kolei odpowiada za przechowywanie wartości aktualnego elementu. W pętli (5.) dopóki :liczba jest większa od zera: (6. - 9.) sprawdź ile razy mieści się :wartosc w :liczba. Przy każdej iterazji wykonanej (7.) dopisz numer aktualnego elementu na listę :lista i (8.) pomniejsz liczbę o :wartosc. Kiedy już nie można zdjąć elementów o aktualnej wartości: (7.) zmniejsz numer elementu o 1 i (8.) zmniejsz wartość, której odpowiada dany element.
(13.) Pobierz długość listy i zapisz od zmiennej :n. (14.) Wylicz podstawę pojedynczego elementu i (15.) faktyczną długość obrazka. (16. - 19.) Przejdź na środek lewego elementu. (20. - 26.) W pętli narysuj każdy kolejny element z :lista. W trakcie iteracji (21.) wybierz orientację elementu, (22.) narysuj go i (23. - 25.) przejdź do elementu obok.
Zdefiniuj funkcję ILEZ :słowo, której daną jest dowolne słowo.
Wynikiem funkcji jest liczba znaków znajdujących się w tym słowie pomiędzy skrajnymi samogłoskami, tj. pomiędzy pierwszą i ostatnią samogłoską, ale bez tych samogłosek. Uznajemy, że samogłoskami są jedynie znaki: a, e, i, o, u oraz y.
W przypadku braku samogłosek w danej :słowo, wartością funkcji jest -2, a w przypadku gdy w słowie jest tylko jedna samogłoska, wartością funkcji jest -1.
ILEZ "hokuspokus | jest 6 |
---|---|
ILEZ "klucz | jest -1 |
ILEZ "xxx | jest -2 |
Strategia polega na przygotowaniu listy pozycji na których występują samogłoski. W ten sposób można łatwo sprawdzić czy występuje odpowiednia ilość samogłosek i jeśli tak to wyliczyć szukaną różnicę.
(2.) Przygotuj listę :pozycje na indeksy samogłosek w :słowo. (3. - 8.) Dla każdego znaku w :słowo: (4.) pobierz kolejny znak i (5.) sprawdź czy jest samogłoską. Jeśli tak to (6.) dopisz numer powtórzenia na listę (tj. indeks tego znaku.). Po przygotowaniu indeksów (9.) sprawdź jest więcej niż jeden element. Jeśli tak to znaczy, że są conajmniej dwie samogłoski i zwrócona wartość to (10.) ostatnia pozycja minus pierwsza pozycja pomniejszona o jeden. W przciwnym razie (12.) wystarczy zwrócić długość listy :pozycje minus dwa.
Zdefiniuj funkcję SUMAS :s1 :s2, są dwa niepuste słowa, mogące składać się tylko z 10 pierwszych małych liter alfabetu łacińskiego (tj. a, b, c, d, e, f, g, h, i, j). Poszczególne znaki danych słów są zakodowanymi cyframi dziesiętnymi, w ten sposób, że kolejnym literom alfabetu odpowiadają cyfry od 0 do 9. Wynikiem funkcji jest słowo będące kodem sumy zakodowanych liczb. Zakładamy poprawność danych :s1 i :s2.
SUMAS "j "j | jest "bi |
---|---|
SUMAS "baab "jjj | jest "caaa |
Każda litera reprezentuje inną cyfrę. Zadania można rozwiązać na dwa sposoby. Pierwszy z nich, który został przedstawiony poniżej, zamienia liczbę zapisaną literami na cyfry. Potem operacja dodawania zostaje wykonana na liczbach, a nie słowach. Suma zostaje zakodowana i zwrócona jako wynik. Drugi sposób polega na napisaniu funkcji, która potrafi dodawać litery. Tego typu rozwiązanie jest krótsze, ale może okazać się mało czytelne dla osób nie wtajemniczonych odpowiednio w algorytmy.
(2.) Przygotuj listę na podstawie, której będzie określana wartość znaków. Znak na i-tej pozycji ma wartość i - 1. (3.) ustal początkową wartość liczby na 0 oraz (4.) mnożnik pierwszej "cyfry" na 1. (5.) Pobierz długość cyfry. (6. - 10.) Dla każdej litery: (7.) pobierz kolejną literę od końca i (8.) dodaj jej wartość pomnożoną przez mnożnik do :a. (9.) Zwiększ mnożnik. Na koniec (11.) zwróć wyliczoną liczbę :a.
(2.) Przygotuj listę na podstawie, której będzie określana wartość znaków. (3.) Przygotuj zmienną do zapisu danych. W pętli (4. - 8.) pobieraj kolejne cyfry: (5.) pobierz cyfrę z :l, (6.) dopisz odpowiednią literę do zmiennej wynikowej i (7.) usuń cyfrę z :l. Na koniec (9.) zwróć zmienną :w.
Funkcje może nie były łatwe do napisania, ale dzięki nim napisanie funkcji głównej jest bardzo łatwo. Wystarczy wyliczyć wartość (2.) słowa pierwszego oraz (3.) drugiego. Na koniec (4) zwróć zakodowaną sumę liczb :a i :b.