Strona główna » Poradniki » Logomocja » LOGIA » Logia 1994/95 - Etap II
 

Logia 1994/95 - Etap II

· Etap I · Etap II · Etap III ·
iOryginalna treść zadań jest dostępna pod oficjalnym adresem konkursu LOGIA

Zadanie 1

Napisz procedurę ZAKODUJ :wyraz, której wywołanie koduje :wyraz według następującej reguły: litera a ma zostać zastąpiona przez literę z, litera b przez y, litera c przez x, ..., wreszcie litera z ma zostać zastąpiona przez literę a. Zakodowane mają być jedynie małe litery alfabetu łacińskiego, wszystkie inne znaki (w tym polskie litery mają zostać wypisane bez zmian).

Oto przykładowe wyniki:

ZAKODUJ "abrakadabrapowinno wypisać na ekranie słowo zyizpzwzyiz
ZAKODUJ "AlaMaKotapowinno wypisać na ekranie słowo AozMzklgz

Do rozwiązania tego zadania przyda się znajomość tablicy ASCII. Każdy znak to w rzeczywistości dla komputera liczba. Używając funkcji ascii możemy uzyskać jego kod. W celu zamienienia liczby na znak użyjemy funkcji znak:

  1. oto ZAKODUJ :wyraz
  2.   niech "wynik "
  3.   powtórz (długość :wyraz)[
  4.       niech "a (element npw :wyraz)
  5.       jeżeli (i (ascii :a >= 97) (ascii :a <=122))[
  6.           niech "wynik nap :wynik znak ((ascii "z) - (ascii :a) + 97)
  7.       ][
  8.           niech "wynik nap :wynik :a
  9.       ]
  10.   ]
  11.   wynik :wynik
  12. już

(1.) Funkcja przyjmuje jeden argument :wyraz - jest to wyraz, który mamy zaszyfrować. (2.) Deklarujemy zmienną :wynik do której będziemy zapisywać kolejne litery tekstu wynikowego. (3.) Dla każdego znaku w :wyraz: (4.) tymczasowo każdą kolejną literę zapisujemy do zmiennej :a. (5.) Sprawdzamy warunek czy liczba jest większa od 97 i mniejsza od 122. (Znak 97 to a, a 122 to z, pomiędzy nimi znajdują się wszystkie pozostałe litery alfabetu łacińskiego w porządku alfabetycznym). Jeśli jest to mała litera to (6.) Na koniec :wynik dopisujemy zmieniony znak: obliczamy jego numer n w alfabecie i pobieramy n-ty alfabetu od końca. Jeśli jednak nie jest to mała litera alfabetu to (8.) dopisujemy znak do :wynik bez zmian. Na koniec (11.) zwracamy wartość zmiennej :wynik.

Zadanie 2

Napisz procedurę ILEPAR :liczba, która wypisze, ile razy w liczbie podanej jako parametr występują pary takich samych sąsiednich cyfr (np. w liczbie 2112 taka parą jest jedynie sekwencja dwóch kolejnych jedynek).

Oto przykładowe wyniki:

ILEPAR 6387644powinno wypisać na ekranie 1
ILEPAR 212777powinno wypisać na ekranie 2
ILEPAR 33455powinno wypisać na ekranie 2
ILEPAR 3237powinno wypisać na ekranie 0

Rozwiązanie zadania opiera się o resztę z dzielenia przez dziesięc. W każdej iteracji pobieramy ostatnią cyfrę. Jest to reszta z dzielenia przez 10. W tej samej iteracji usuwamy tę cyfrę z liczby. Licznik zwiększymy tylko wtedy, gdy nowa wartość reszty jest równa poprzedniej. Oto rozwiązanie:

  1. oto ILEPAR :liczba
  2.   niech "licznik 0
  3.   dopóki [:liczba > 0][
  4.     niech "a (reszta :liczba 10)
  5.     niech "liczba (:liczba - reszta :liczba 10) / 10
  6.     jeśli (:a = (reszta :liczba 10))[
  7.         zwiększ "licznik
  8.     ]
  9.   ]
  10.   wynik :licznik
  11. już

(1.) Funkcja ILEPAR przyjmuje tylko jeden argument :liczba. (2.) Deklarujemy zmienną :licznik i ustawiamy wartość na 0. Będziemy ją zwiększać kiedy wykryjemy, że dwie sąsiednie cyfry są identyczne. Pozbywając się cały czas ostatniej cyfry dojdziemy do momentu kiedy liczba wyniesie 0, dlatego wszystkie powtórzenia wykonujemy (3.) dopóki wartość :liczba jest większa od zera. (4.) Pobieramy ostatnią cyfrę :liczba i zapisujemy do zmiennej :a. (5.) Usuwamy ostatnią cyfrę z liczby. (6.) Porównujemy pobraną cyfrę z nową ostatnią cyfrą. Jeśli są równe to (7.) zwiększamy licznik. Na koniec (10.) zwracamy wartość :licznik.

Zadanie 3

Napisz procedurę LAS rysującą "losowy" las. Las powinien składać się z losowej liczby drzew i poziomego podłoża. Drzew powinno być co najmniej cztery, ale nie więcej niż osiem. Każde drzewo powinno mieć pionowy pień o wysokości stanowiącej od jednej czwartej do trzech czwartych wysokości ekranu. Od pnia, symetrycznie po obu jego stronach (parami), w górę pod kątem , powinny wyrastać gałęzie będące odcinkami. Liczba par gałęzi powinna być losowa, ale nie mniejsza niż pięć i nie większa niż dziesięć. Długość gałęzi w danej parze powinna być taka sama, choć różne pary gałęzi mogą mieć różne długości. Długość gałęzi powinna być losowa, nie dopuszczamy gałęzi o długości zero. Najniższa para gałęzi nie może wyrastać na poziomie podłoża, ponad najwyższą parą gałęzi powinien wystawać czubek drzewa. Żadne dwa drzewa nie mogą "nachodzić na siebie", mogą co najwyżej stykać się końcami gałęzi. Odległość pomiędzy pniami dwóch kolejnych drzew powinna być jednakowa. Rysunek powinien wykorzystywać całą szerokość ekranu.

Procedura LAS mogłaby stworzyć taki oto rysunek:

Obrazek 1 do zadania 3

Podczas rozwiązywania zadania warto rozdzielić zadanie na dwa pod zadania. W pierwszej części napiszemy procedurę rysujące losowe drzewo dla podanej szerokości i wysokości. Druga funkcja będzie odpowiednio wywoływać pomocniczą. Taki podział znacząco uprości kod. Funkcja pomocnicza LAS_pom:

  1. oto LAS_pom :szer :ws_max
  2.  niech "n ((losowa 6) + 5)
  3.  niech "h ((losowa :ws_max/2) + (:ws_max/4))
  4.  powtórz (:n) [
  5.   np :h / (:n + 1)
  6.   lw 45
  7.   niech "dl ((losowa :szer) + 1) * pwk(2)
  8.   np :dl
  9.   ws :dl
  10.   pw 90
  11.   np :dl
  12.   ws :dl
  13.   lw 45
  14.  ]
  15.  np :h / (:n + 1)
  16.  ws :h
  17. już

Funkcja LAS_pom rysuje drzewo od miejsca i kierunku gdzie żółw jest ustawiony. (1.) Do funkcji przekazujemy dwa argumenty :szer i :ws_max, które określają jak szerokie może być drzewo oraz jak wysokie. (2.) Losujemy ile będzie miało drzewo gałęzi z przedziału 5, a 10. (3.) Losujemy wysokość drzewa. (4.) Rysujemy :n gałęzi: (5.) odcinek pomiędzy ziemią i gałęzią, między gałęziamy i długość czubka są równe, dlatego przesuwamy o (doliczamy odcinek czubka). (5.) Obracamy żółwia w lewo o . (6.) Wyliczamy długość gałęzi. Dodajemy jeden, aby długość gałęzi nigdy nie wyniosła 0. (7. - 12.) Rysujemy dwie gałęzie i wracamy do miejsca gdzie skończyliśmy ruch z (5.). Na koniec (15.) dorysowujemy czubek i (16.) wracamy tam gdzie zaczęliśmy procedure LAS_pom.

Druga procedura LAS wyśrodkuje obraz i wyliczy szerokości drzew na podstawie wylsowanej ich ilości:

  1. oto LAS
  2.  niech "szer 796
  3.  niech "wys 496
  4.  niech "drzewa ((losowa 5) + 4)
  5.  pod
  6.  ws :wys/2
  7.  opu
  8.  lw 90
  9.  np :szer/2
  10.  ws :szer
  11.  np :szer / :drzewa / 2
  12.  powtórz (:drzewa)[
  13.    pw 90
  14.    LAS_pom :szer / :drzewa / 2 :wys
  15.    lw 90
  16.    pod
  17.    np :szer / :drzewa
  18.    opu
  19.  ]
  20. już

Ustalamy (2.) szerokość i (3.) wysokość obszaru w którym ma się zmieścić rysunek. (4.) Losujemy ilość drzew i zapisujemy do zmiennej :drzewa. (6.) Przesuwamy (5.) podniesiony pisak na poziom pni i opuszczamy (6.). (7. - 10.) Rysujemy dolną kreskę lasu. Znajdujemy się teraz w prawym dolnym rogu rysunku. (11.) Przesuwamy pisak na pozycję pierwszego drzewa. (12.) Rysujemy drzewa: (13.) Ustawiamy żółwia pionowo w górę, (14.) rysujemy drzewo, (15.) skręcamy w lewo o , (16.) podnosimy pisak i (17.) przesuwamy się na pozycję następnego drzewa.