Zdefiniuj procedurę RYSUJ :s, której daną może być dowolne niepuste słowo utworzone z małych liter alfabetu łacińskiego (bez polskich znaków diakrytycznych) oraz cyfr. Procedura tworzy rysunek złożony z kwadratów oraz dwa razy wyższych prostokątów. Kolejne rysowane figury odpowiadają kolejnym znakom danej. Znaki przedstawiamy jako kwadraty lub prostokąty zgodnie z ich wysokością:
Prostokąty odpowiadające cyfrom wypełniamy kolorem zielonym, figury odpowiadające samogłoskom wypełniamy kolorem czerwonym, zaś spółgłoskom - żółtym. Rysunek powinien mieścić się na ekranie i być możliwie duży, maksymalna długość słowa wynosi 100 znaków.
Poniżej znajdują się przykładowe rysunki uzyskane przez odpowiednie wywołania:
W celu uproszczenie rysowania prostokątów i nie powielania kodu po kilka razy w głównej procedurze warto napisać procedurę prostokat, która narysuje figurę o zadanych wymiarach :w x :h i wypełni kolorem :kolor.
Dodatkowo w trakcie rysowania kolor, w przypadku małego znaku alfabetu łacińskiego, określa się na podstawie tego czy znak jest samogłoską. Poniżej znajduje się funkcja samogłoska?, która zwraca wartość logiczną czy dany znak :a jest samogłoską:
Mając napisany kod pomocniczy napisanie funkcji RYSUJ jest o wiele prostsze. Ze względu na fakt, że RYSUJ to funkcja pierwotna i nie można jej nadpisać to została ona zapisana jako RYSUJ2.
Na początek należy wyliczyć szerokość kwadratu na podstawie (2.) szerokości strony oraz (3.) wysokości. (4.) Najpierw szerokość jest wyliczany z szerokości, ale należy pamiętać, że dla długości mniejszej, równej 3 długość :a może wyjść za duża i dlatego (5.) należy ewentualnie wykonać poprawkę względem wysokości.
Strategia rysowania liter opiera się na listach (6.) :elz i (7.) :elna. Mianowicie dla każdej litery o indeksie i na liście :elz na drugiej liście pod tym samym indeksie znajduje się cyfra określająca styl rysowanego prostokąta (1 - wysunięty prostokąt do góry, 2 - prostokąt w dół oraz 3 - kwadrat). (8. - 11.) Przesuń żółwia na początek rysowania.
(12.) Dla każdego znaku: (13.) pobierz znak. Następnie (14.) jeśli to liczba to (15.) narysuj odpowiedni prostokąt. (16.) W przeciwnym wypadku: (17. - 21.) określ kolor figury i (22. - 27.) wybierz odpowiedni styl, aby narysować figurę odpowiadającą znakowi. (28. - 31.) Po narysowaniu litery przesuń w prawo o odległość :a.
Zdefiniuj funkcję LC :s, której daną może być dowolne słowo składające się z par litera-cyfra (np. "a5z3x0y2), a wynikiem - słowo składające się wyłącznie z liter, w którym każdej kolejnej parze litera-cyfra danego słowa odpowiada ciąg tylu identycznych liter, jaka jest wartość cyfry występującej bezpośrednio po literze.
LC "a3n5z1 | jest "aaannnnnz |
---|---|
LC "x7y0a1z2z1c4 | jest "xxxxxxxazzzcccc |
Przykładowe rozwiązanie to rozwiązanie rekurencyjne, które opiera się na fakcie, że wyraz :s składa się z par litera-cyfra. Mianowicie jeśli drugi znak to cyfra to tyle razy dopisujemy ją na końcu :s i wywołujemy ponownie funkcję LC z nową wartością :s. Rekurencja kończy się kiedy na drugiej pozycji nie ma cyfry.
(2.) Jeśli na drugiej pozycji nie ma cyfry to zwróć :s. W przeciwnym wypadku (3. - 4.) odkoduj pierwszą parę i (5.) wywołaj funkcję ze zmienioną wartością :s. Bardzo ważne, aby pamiętać, aby usunąć z :s odkodowaną parę litera-cyfra.
Uwaga: takie rozwiązanie jest krótkie i poprawne, ale należy pamiętać, że program mógłby się zapętlić, gdyby umożliwić wstawianie par cyfra-cyfra.
Zdefiniuj funkcję KOD :s, której daną może być dowolne niepuste słowo składające się jedynie z małych liter alfabetu łacińskiego. Wynikiem funkcji jest słowo, utworzone z danego słowa według następujących zasad:
KOD "abrakadabra | jest "abraakaadaabra |
---|---|
KOD "skrzynka | jest "szyynka |
KOD "warsztat | jest "waartaat |
W celu napisania krótkiego i efektywnego kodu warto sobie zdać sprawę, że pierwszą i ostatnią literę należy przepisać bez zmian tj. w pętli iterującej po słowie nie uwzględniać ich w jakikolwiek sposób. Ponadto skrajne spółgłoski można odnaleźć poprzez sprawdzenie czy obok nich występuje samogłoska. Oczywiście można to też rozwiązać porównując czy dana litera jest otoczona poprzez spółgłoski.
(2.) Utwórz zmienną do której będą dopisywane kolejne części tekstu wynikowego. Przypisz jej pierwszą literę słowa :s. (3.) Dla każdego znaku prócz pierwszego i ostatniego: (4.) pobierz odpowiedni znak. (5.) Jeśli pobrany znak to samogłoska to (6.) zawsze dopisz do wyniku dwa takie znaki. (7.) Jednak w przypadku samogłoski przed (9.) dopisaniem (8.) upewnij się, że obok niej występuje samogłoska. Na koniec (12.) dopisz ostatni znak do wyniku.