Strona główna » Poradniki » Logomocja » LOGIA » Logia 1997/98 - Etap III
 

Logia 1997/98 - Etap III

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

Zadanie 1

Zdefiniuj funkcję z jednym parametrem DOSTU :listaliczb, której wartością dla danej listy liczb całkowitych jest:

  • ta sama lista liczb, jeśli jej suma wynosi sto,
  • dana lista liczb całkowitych z dopisaną na końcu jedną liczbą, taką, że suma nowej listy wynosi 100.

Oto przykładowe wyniki:

DOSTU [35 -15 77]ma wartość [35 -15 77 3]
DOSTU [35 -15 80]ma wartość [35 -15 80]
DOSTU [35 -15 77 33]ma wartość [35 -15 77 33 -30]
DOSTU []ma wartość [100]

Zadanie polega na policzeniu sumy elementów na liście, a potem jeśli suma jest różna od 100 to dopisanie na końcu wyniku 100 - suma:

  1. oto DOSTU :listaliczb
  2.   niech "a 0
  3.   powtórz (długość :listaliczb)[
  4.     niech "a :a + element npw :listaliczb
  5.   ]
  6.   jeśli (:a <> 100)[
  7.     niech "listaliczb nak (100 - :a) :listaliczb
  8.   ]
  9.   wynik :listaliczb
  10. już

(2.) Ustalenia a (sumy liczb na liście) na 0. (3. - 5.) Sumowanie wszystkich elementów na liście. (6.) O ile suma jest różna od 100 to (7.) dopisanie na końcu liczby, która spowoduje, że suma liczba na liście wyniesie 100. (9.) Zwrócenie wyniku tj. zmodyfikowanej lub też nie listy na wejściu.

Zadanie 2

Kwadrat o boku 16 można pokryć 85 jednakowymi płytkami w kształcie litery L (utworzonej z trzech jednostkowych kwadratów) i jedną płytką w kształcie kwadratu o boku 1. Poniższe rysunki przedstawiają dwa takie ułożenia różniące się położeniem kwadratowej płytki.

Obrazek 1 do zadania 2

Kwadratowa płytka na rysunku pierwszym ma współrzędne [13,8] - leży w 13 wierszu od góry i w 8 kolumnie od lewej. Kwadratowa płytka na rysunku drugim ma współrzędne [8,6] - leży w 8 wierszu od góry i w 6 kolumnie od lewej. Kwadratowa płytka w lewym górnym rogu ma oczywiście współrzędne [1,1], a płytka w prawym dolnym rogu [16,16].

Napisz procedurę z dwoma parametrami POSADZKA :w :k, która dla danych wartości współrzędnych :w :k z zakresu [1..16], tworzy na środku ekranu możliwie duży rysunek kwadratu pokryty 85 płytkami w kształcie L i jedną płytką kwadratową o danych współrzędnych.

W zadaniu warto zauważyć, że jest ono bardzo podobne do zadania 3 z etapu II. Przed przystąpieniem do czytania tego rozwiązania prosze zapoznać się z rozwiązaniem wspomnianaego zadania. Procedura POSADZKA wygląda następująco:

  1. oto POSADZKA :w :k
  2.   niech "h 400
  3.   pod
  4.   ws :h/2
  5.   pw 90
  6.   ws :h/2
  7.   lw 90
  8.   opu

(2.) Ustalenie wysokości rysunku i (3. - 8.) przejście w jego lewy, dolny róg.

  1.   niech "rozmiar 8
  2.   powtórz 4 [
  3.       niech "pozx int((:k - 1)/:rozmiar)
  4.       niech "pozy int((:w - 1)/:rozmiar)
  5.       L (3-npw+1) :h POSADZKA_wartosc :pozx :pozy
  6.       jeśli (:w > :rozmiar)[
  7.         niech "w :w - :rozmiar
  8.       ]
  9.       jeśli (:k > :rozmiar)[
  10.         niech "k :k - :rozmiar
  11.       ]
  12.       niech "rozmiar :rozmiar/2
  13.       niech "h :h/2
  14.       pod
  15.       jeśli(I :pozx = 0 :pozy = 0)[np :h]
  16.       jeśli(I :pozx = 1 :pozy = 0)[np :h pw 90 np :h lw 90]
  17.       jeśli(I :pozx = 1 :pozy = 1)[pw 90 np :h lw 90]
  18.       opu
  19.   ]

(9.) Ustalenie wartości zmiennej :rozmiar. Zmienna ta będzie określała połowę długości kwadratu w którym obecnie jest rysowane L. Na początek jest to 8, ponieważ szerokość obrazka to 16. (10.) Rysowanie L odbędzie się 4 razy: (11. - 12.) Na początek należy określić w którym rogu znajduje się pole (czy np. w prawym, górnym). (13.) Następnie rysowane jest L o odpowiedniej złożoności, rozmiarze i przesunięciu dookoła. Przesunięcie zapewnia POSADZKA_wartosc, która zwraca o ile trzeba obrócić L.

(14. - 19.) W celu określenie pozycji w niezarysowanej przestrzeni należy zmniejszyć :w i :k jeśli którą jest większa od :rozmiar. (20. - 21.) Zmniejszenie :rozmiar i :h dwa razy, ponieważ niezarysowana przestrzeń jest cztery razy mniejsza. (22. - 26.) W zależności od tego gdzie znajduje się wolna przestrzeń tam jest przesuwany żółw tak, aby znalazł się w lewynm dolnym rogu wolnej przestrzeni.

  1.   wielokąt[
  2.     ukm "czarny
  3.     powtórz 4[
  4.       np :h
  5.       pw 90
  6.     ]
  7.   ]
  8. już

(28. - 34.) Ostatni etap polega na narysowaniu kwadratu.

Wspomniana wcześniej funkcja POSADZKA_wartosc w zależności od wartości :pozx i :pozy zwraca o ile należy obrócić L zgodnie z poniższą tabelką:

01
32

  1. oto POSADZKA_wartosc :a :b
  2.   jeśli(I :a = 0 :b = 0)[wynik 0]
  3.   jeśli(I :a = 1 :b = 0)[wynik 1]
  4.   jeśli(I :a = 1 :b = 1)[wynik 2]
  5.   jeśli(I :a = 0 :b = 1)[wynik 3]
  6. już

Procedura L_rek pozostaje niezmieniona, ale funkcja L wymaga drobnej poprawki:

  1. oto L :n :h :r
  2.   niech "r :r + 3
  3.   pod
  4.   powtórz :r[
  5.     np :h
  6.     pw 90
  7.   ]
  8.   opu
  9.   L_rek :n :h
  10.   pod
  11.   powtórz :r[
  12.     lw 90
  13.     ws :h
  14.   ]
  15.   opu
  16. już

(1.) Funkcja prócz stopnia złożoności :n przyjmuje :h - rozmiar oraz :r - obrócenie L. (2.) Korekcja wartości z POSADZKA_wartosc. (3. - 8.) Odpowiednie obrócenie L, (9.) narysowanie i (10. - 15.) i powrót do pozycji wyjściowej.

Wyjaśnienie procedury L_rek znajduje się w zadaniu 3 z etapu II.

Zadanie 3

Kwadratową siatką o rozmiarze n nazywamy wycinek pokratkowanej kartki papieru mający n*n kratek. Pola kwadratowej siatki (tj. kratki) numerujemy kolejno wierszami od lewego górnego pola do prawego dolnego liczbami od 0 do n*n-1. Na przykład kwadratowa siatka o rozmiarze 8 ma 64 pola ponumerowane od 0 do 63, jak w tabelce:

01234567
89101112131415
1617181920212223
2425262728293031
3233343536373839
4041424344454647
4849505152535455
5657585960616263

Jeżeli rozmiar siatki jest parzysty, to można ja podzielić na cztery ćwiartki o identycznych rozmiarach. Cztery ćwiartki siatki numerujemy wg tej samej zasady jak pola:

  • ćwiartka w lewym górnym rogu siatki ma numer 0,
  • ćwiartka w prawym górnym rogu ma numer 1,
  • ćwiartka w lewym dolnym rogu ma numer 2,
  • ćwiartka w prawym dolnym rogu ma numer 3.

Zdefiniuj funkcję z dwoma parametrami NUMER_CWIARTKI :rozmiar :numer, której wartością dla danego rozmiaru kwadratowej siatki, będącego parzystą liczbą całkowitą dodatnią, oraz numeru pola jest numer ćwiartki, w której leży to pole. Oto przykładowe wyniki:

NUMER_CWIARTKI 4 5ma wartość: 0
NUMER_CWIARTKI 4 13ma wartość: 2

Twoja funkcja będzie testowana tylko dla poprawnych danych. Może nie mieć wartości lub mieć wartość przypadkową, jeśli dane nie są poprawne, np. jeśli :rozmiar nie jest liczbą parzystą lub :numer jest za duży.

Zadanie polega na wyliczeniu pozycji liczby na podstawie podanej wartości. Warto zauważyć, że reszta z dzielenia podanej liczby przez rozmiar tabelki to numer kolumny w której pole się znajduje. Warto zwrócić uwagę, że otrzymane wartości będą z zakresu [0, 7]. W celu wyliczenia numeru wiersza w której znajduje się pole należy od numeru pola odjąć numer kolumny i podzielić wynik przez rozmiar tabeli. W ten sposób można uzyskać pozycję (x, y) dla wybranego numeru.

Druga część zadania sprowadza się do zauważenia, że jeśli pole leży w dolnej połowie to należy do wyniku dodać 2. Jeśli pole znajduje się w prawej połowie tabeli to należy dodać 1. Suma jednej i drugiej wartości jest odpowiedzią na zadanie.

  1. oto NUMER_CWIARTKI :rozmiar :numer
  2.   niech "w 0
  3.   niech "pozy reszta :numer :rozmiar
  4.   niech "pozx (:numer - :pozy) / :rozmiar
  5.   jeśli (:pozx >= :rozmiar/2)[
  6.     niech "w :w + 2
  7.   ]
  8.   jeśli (:pozy >= :rozmiar/2)[
  9.     zwiększ "w
  10.   ]
  11.   wynik :w
  12. już

(2.) Zadeklarowanie zmiennej wynikowej. Wyliczenie pozycji (3.) y oraz (4.) x. (5. - 10.) Odpowiednie zwiększenie :w w zależności od pozycji i (11.) zwrócenie wyniku.

Rzecz jasna całe zadanie można zapisać w jednej linijce w następujący sposób:

  1. oto NUMER_CWIARTKI2 :rozmiar :numer
  2.   wynik (2*int((:numer - reszta :numer :rozmiar)/:rozmiar)/(:rozmiar/2))
  3.     + (int ((reszta :numer :rozmiar)/(:rozmiar/2)))
  4. już