Strona główna » Poradniki » Logomocja » LOGIA » Logia 2015/16 Etap I
 

Logia 2015/16 Etap I

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

Zadanie 1

Rysunek pomocniczy

Napisz bezparametrową procedurę/funkcję motyw, po wywołaniu której na środku ekranu powstanie rysunek taki, jak poniżej. Wysokość rysunku wynosi 480.

Strategia

Przyglądając się dokładnie obrazkowi można zauważyć, że składa się on z 9 podobnych części (pod względem środka). Rysując elementy wierszami co drugi z nich ma dodatkowo wzorki na zewnątrz kwadratu. Ponadto warto zauważyć, że zewnętrzne obramowanie jest podobne do tego obramowania ze środka kwadratu, więc możliwe jest napisanie procedury, która narysuje obydwa wzorki (oczywiście dostosowując odpowiednio parametry).

Rozwiązanie

Poniższa procedura motyw rozwiązuje podane zadanie. W celu narysowania początkowo: (2.) ustala licznik rysowanego elementu na 0 oraz na podstawie (2.) wysokości rysunku (3.) oblicza bok najmniejszego kwadratu.

  1. oto motyw
  2.   niech "i 0
  3.   niech "h 480
  4.   niech "a :h/15
  5.   pod
  6.   ws :h/2 pw 90
  7.   ws :h/2 lw 90
  8.   opu

Następnie (9.) dla każdego wiersza i (10.) każdej kolumny: (12. - 14.) rysowana jest obwódka i (15. - 17.) zewnątrzny wzór jeśli jest to odpowiedni element. Dalsza część kodu: (18. - 24.) rysuje mniejszy wzór oraz (25. - 29.) środkowy, najmniejszy kwadrat. (34.) Po narysowaniu kwadratu należy pamiętać, aby zwiększyć numer następnego elementu do narysowania.

  1.   powtórz 3 [
  2.     powtórz 3 [
  3.       opu
  4.       powtórz 4 [
  5.         np :a*5 pw 90
  6.       ]
  7.       jeśli (reszta :i 2 = 0) [
  8.         motyw_wzor :a 3
  9.       ]
  10.       pod
  11.       np :a pw 90 np :a lw 90
  12.       opu
  13.       motyw_wzor :a 1
  14.       pod
  15.       np :a pw 90 np :a lw 90
  16.       opu
  17.       wielokąt [
  18.         powtórz 4 [
  19.           np :a pw 90
  20.         ]
  21.       ]
  22.       pod
  23.       ws :a*2 pw 90
  24.       np :a*3 lw 90
  25.       opu
  26.       zwiększ "i
  27.     ]
  28.     pw 90 ws :h
  29.     lw 90 np :a*5
  30.   ]
  31. już

Dodatkowy wzór

Wzór polegający na narysowaniu ząbki realizuje poniższa procedura motyw_wzor. Rysuje ona wzór o zadanej długości :a najmniejszego boku oraz :n - ile ma być zębów narysowanych we wzorze.

  1. oto motyw_wzor :a :n
  2.   niech "b :a*pwk(2)
  3.   powtórz 4 [
  4.     wielokąt [
  5.       np :a pw 135
  6.       np :b
  7.     ]
  8.     np :a
  9.     powtórz (:n) [
  10.       wielokąt [
  11.         pw 45 np (:b/2)
  12.         lw 90 np (:b/2)
  13.       ]
  14.       np :a
  15.     ]
  16.     np :a pw 90
  17.   ]
  18. już

Zadanie 2

Napisz jednoparametrową procedurę/funkcję piramida, po wywołaniu której na środku ekranu powstanie rysunek piramidy takiej, jak poniżej. Parametr określa liczbę poziomów piramidy, która jest także liczbą elementów w podstawie piramidy. Parametr może przyjmować wartości od 1 do 10. Wysokość każdego poziomu jest stała i wynosi 48.

piramida 1
piramida 2
piramida 3

Rozwiązanie

  1. oto piramida :n
  2.   niech "h 48
  3.   niech "a :h/12
  4.   niech "s [08 71 1511 113111 111311 111131 1115]
  5.   niech "s zd zd :s [11] wspak :s
  6.   pod
  7.   ws :h*:n/2 pw 90
  8.   ws (:a*(14*:n + 1))/2 lw 90
  9.   opu
  10.   powtórz (:n) [
  11.     niech "ile :n - npw + 1
  12.     niech "kol 14*:ile + 5
  13.     wielokąt [
  14.       ukm "brązowy
  15.       ukp "brązowy
  16.       powtórz 2 [
  17.         np :h pw 90
  18.         np (:a*:kol) pw 90
  19.       ]
  20.     ]
  21.     niech "p poz
  22.     pod
  23.     np :a pw 90
  24.     np :a lw 90
  25.     opu
  26.     wielokąt [
  27.       ukm "żółty
  28.       ukp "żółty
  29.       powtórz 2 [
  30.         np (:h-2*:a) pw 90
  31.         np (:a*(:kol - 2)) pw 90
  32.       ]
  33.     ]
  34.     pod
  35.     np :a pw 90
  36.     np :a lw 90
  37.     opu
  38.     powtórz (:ile) [
  39.       niech "x (reszta npw 2)*2-1
  40.       powtórz (długość :s) [
  41.         niech "el element npw :s
  42.         piramida_kod :a :el
  43.         pod pw 90*:x np :a lw 90*:x opu
  44.       ]
  45.       pod
  46.       np :a*8 lw 180
  47.       jeśli (reszta npw 2 = 0) [
  48.         lw 90 np :a*2 pw 90
  49.       ]
  50.       opu
  51.     ]
  52.     pod
  53.     ustalPoz :p
  54.     skieruj 0
  55.     np :h pw 90
  56.     np :a*7 lw 90
  57.     opu
  58.   ]
  59. już
  1. oto piramida_kod :a :kod
  2.   niech "suma 0
  3.   powtórz (długość :kod) [
  4.     niech "el element npw :kod
  5.     niech "suma :suma + :el
  6.     jeżeli (reszta npw 2 = 1) [
  7.       pod np :a*:el opu
  8.     ][
  9.       powtórz (:el) [
  10.         wielokąt [
  11.           ukp "brązowy
  12.           ukm "brązowy
  13.           powtórz 4 [
  14.             np :a pw 90
  15.           ]
  16.         ]
  17.         pod np :a opu
  18.       ]
  19.     ]
  20.   ]
  21.   pod ws :a*:suma opu
  22. już

Zadanie 3

Rysunek pomocniczy

Napisz jednoparametrową procedurę/funkcję ornament, po wywołaniu której na środku ekranu powstanie rysunek motywu takiego, jak poniżej. Parametr określa liczbę zielonych liści tworzących ornament i może przyjmować wartości od 3 do 16. Odległość pomiędzy środkami skrajnych liści jest stała i wynosi 500. Wszystkie odcinki tworzące pojedynczy liść mają długość a lub 2a. Odległość między środkami dwóch sąsiednich liści wynosi 10a.

ornament 3
ornament 4

Rozwiązanie

  1. oto ornament :n
  2.   niech "w 500
  3.   niech "a :w/10/(:n-1)
  4.   pod
  5.   lw 90 np :w/2
  6.   pw 90
  7.   opu
  8.   powtórz :n [
  9.     jeśli (reszta npw 2 = 0) [
  10.       pw 180
  11.     ]
  12.     ornament_el :a
  13.     skieruj 0
  14.     pod
  15.     pw 90 np :a*10
  16.     lw 90
  17.     opu
  18.   ]
  19. już
  1. oto ornament_el :a
  2.   niech "h (:a*5*pwk(3))/2
  3.   pod
  4.   ws :h/3 pw 90
  5.   ws :a*2.5 lw 60
  6.   opu
  7.   wielokąt [
  8.     powtórz 3 [
  9.       ukm "oliwkowy5
  10.       np (:a*2) lw 90
  11.       np :a lw 90
  12.       np :a pw 30
  13.       np :a pw 120
  14.       np :a lw 30
  15.       np :a
  16.       powtórz 3 [
  17.         lw 60 np :a
  18.         pw 120 np :a
  19.       ]
  20.       lw 60 np :a
  21.       lw 30 np :a
  22.       pw 120 np :a
  23.       pw 30 np :a
  24.       lw 90 np :a
  25.       lw 90 np (:a*2)
  26.       pw 120
  27.     ]
  28.   ]
  29.   pod
  30.   pw 60 np :a*2.5
  31.   lw 90 np :h/3
  32.   opu
  33. już

Zadanie 4

Napisz jednoparametrową funkcję irs, której wynikiem jest n-ta w porządku rosnącym dodatnia liczba całkowita mająca tę cechę, że iloczyn cyfr tej liczby jest równy sumie cyfr tej liczby. Parametr n może przyjmować wartości od 1 do 98.

irs 5jest 5
irs 11jest 123
irs 69jest 111126

Strategia

Zadania można podzielić na dwie funkcje. Jedna z nich irs zwróci wynik wynikający z treści zadania, a druga irs? sprawdzi czy podana liczba :n jest liczbą spełniającą zależności. Taki podział pozwala na zapisanie dwóch, krótkich części kodu, który jest prostszy w rozumieniu. Warto zauważyć, że liczby majace w sobie cyfrę 0 i niebędące 0 na pewno nie spełnią warunku.

Rozwiązanie

Czy irs?

Funkcja pomocnicza irs? sprawdza czy dana liczba :n jest liczbą irs. Jeśli tak to zostanie zwrócona prawda, a w przeciwnym razie fałsz.

  1. oto irs? :a
  2.   niech "iloczyn 1
  3.   niech "suma 0
  4.   powtórz (długość :a) [
  5.     niech "el element npw :a
  6.     niech "iloczyn :iloczyn*:el
  7.     niech "suma :suma+:el
  8.   ]
  9.   wynik (:iloczyn = :suma)
  10. już

Przygotuj zmienne do przechowywania (2.) iloczynu oraz (3.) sumy. Następnie (4. - 8.) dla każdej cyfry aktualizuj obie zmienne. Na koniec (9.) zwróć wynik porównania.

Funkcja główna

Z kolei funkcja główna sprawdza (3. - 8.) wyszukuje kolejnych liczb irs. Jeśli taką napotka to zmniejsza wartość :n o 1. Kiedy licznik osiągnie 0 to znaczy, że została znaleziona :n-ta wartość i należy (9.) zwrócić aktualną wartość :a.

  1. oto irs :n
  2.   niech "a 0
  3.   dopóki [:n > 0][
  4.     zwiększ "a
  5.     jeśli (irs? :a) [
  6.       zmniejsz "n
  7.     ]
  8.   ]
  9.   wynik :a
  10. już