Strona główna » Poradniki » Logomocja » LOGIA » Logia 2014/15 Etap I
 

Logia 2014/15 Etap I

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

Zadanie 1

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

Strategia

Obrazek składa się z wielu bardzo podobnych części: wewnątrz i na zwenątrz znajdują się czerwone trójkąty. Dodatkowo warto zauważyć, że każdy sześciokąt został podzielony na 6 trójkątów, a każdy trójkąt jest w połowie zamalowany na różowo. Zadanie można wykonać rysując sześć takich samych części rysunku.

Rozwiązanie

Na początku ustalane są dwie wartości. Zostały one dobrane tak, aby rysunek spełniał założenia o minimalnej wysokości.

  1. oto serwetka
  2.   niech "a 80
  3.   niech "c :a/pwk(2)

Potem rozpoczyna się pętla właściwa. Zostanie ona wykonana sześć razy. Za każdym razem zostaje ona wykonana ze środka rysunku, więc (5. - 8.) najpierw przesuwamy do środka kolejnego sześciokątu i (9. - 21.) rysujemy sześciokąt z trójkątami zamalowanymi w połowie.

  1.   powtórz (6) [
  2.     pod
  3.     np :a pw 60
  4.     np :a
  5.     opu
  6.     powtórz 6 [
  7.       powtórz 3 [
  8.         np :a pw 120
  9.       ]
  10.       np :a pw 120
  11.       wielokąt [
  12.         ukm "czerwony11
  13.         np :a pw 120
  14.         np (:a/2)
  15.       ]
  16.       lw 120 ws :a
  17.       pw 60
  18.     ]

Dalsza część kodu polega na (22. - 30.) dorysowaniu czerwonych elementów na zewnątrz. Tu warto zauważyć, że z pozycji środka sześciokąta każdy kolejny można narysować wykonując ten sam zestaw instrukcji i wystarczy tylko pomiędzy kolejnymi wywołaniami obrócić żółwia. Na koniec pętli (31. - 37.) dorysowany zostaje wewnętrzny czerwony trójkąt i (38. - 43.) żółw wraca do pozycji wyjściowej.

    Zadanie 2

    Napisz jednoparametrową procedurę/funkcję ramka, po wywołaniu której na środku ekranu powstanie rysunek, taki jak poniżej. Parametr określa liczbę powtarzających się fragmentów rysunku i może przyjmować wartości od 1 do 5. Wysokość rysunku wynosi 480, a długość boku wewnętrznego białego kwadratu dla parametru 1 wynosi 240.

    ramka 1
    ramka 3

    Strategia

    Rysunek można narysować rekurencyjnie, albo iteracyjnie. Kod zamieszczony niżej przedstawia drugą z tych wersji. Zakłada się, że początku każdej iteracji żółw znajduje się pośrodku rysunku. Dopiero później przesuwa się on w lewy dolny róg rysunku i cztery razy rysuje ten sam fragment przechodząc od rogu do rogu.

    Rozwiązanie

    Poniższa procedura ramka rysuje obrazek zgodnie z poleceniem.

    1. oto ramka :n
    2.   niech "a 240
    3.   powtórz (:n) [
    4.     niech "a :a/2
    5.     niech "b :a*pwk(2)
    6.     pod
    7.     ws :a*2 pw 90
    8.     ws :a*2 lw 90
    9.     opu
    10.     powtórz 4 [
    11.       wielokąt [
    12.         ukm "oliwkowy
    13.         ukp "oliwkowy
    14.         pw 45 np :b
    15.         lw 135 np :a
    16.         pw 135 np (:b/2)
    17.         lw 90 np (:b/2)
    18.         pw 45 np :a
    19.         pw 135 np (:b/2)
    20.         lw 90 np (:b/2)
    21.         pw 135 np (:a*3)
    22.         pw 90 np :a
    23.         pw 90
    24.       ]
    25.       pod
    26.       np :a*4 pw 90
    27.       opu
    28.     ]
    29.     pod
    30.     np :a*2 pw 90
    31.     np :a*2 lw 90
    32.     opu
    33.   ]
    34. już

    (2.) Przypisz zmiennej :a początkową wartość (z treści zadania). Następnie (3.) rozpocznij pętle do wykonania :n razy. Dalej (4. - 5.) oblicz zmienne pomocnicze, (6. - 9.) przejdź w lewy dolny róg rysunku i (10. - 24.) narysuj cztery razy ten sam fragment. Na koniec pętli należy pamiętać (29. - 32.) o powrocie na środek ekranu. Zmniejszanie rozmiaru rysunku odbywa się w linijce (4.).

    Zadanie 3

    Napisz dwuparametrową procedurę/funkcję parkiet, po wywołaniu której na środku ekranu powstanie rysunek parkietu takiego, jak przedstawiony poniżej. Długość boku najmniejszego widocznego na rysunku kwadratu wynosi 10. Pierwszy parametr określa liczbę żółtych kwadratów w wierszu i może przyjmować wartości od 1 do 8. Drugi parametr określa liczbę żółtych kwadratów w kolumnie i może przyjmować wartości od 1 do 5.

    Strategia

    Rysunek składa się z wielu identycznych fragmentów. Każdy z nich można narysować w ten sam sposób: obrysuj kwadrat, następnie w kważdym rogu umieść cztery różowe prostokąt, a środek pomaluj na żółto. W zadaniu należy również pamiętać o tym, że podawana jest ilość żółtych środków, więc iloczyn ich ilości w kolumnie jak i w wierszu oznacza ile takich fragmentów należy narysować.

    Rozwiązanie

    Na początku (2.) warto przypisać wartość 10 do zmiennej (tutaj :a). Następnie (3. - 6.) żółw przesuwa się w lewy dolny róg.

    1. oto parkiet :w :h
    2.   niech "a 10
    3.   pod
    4.   ws :a*9*:h/2 pw 90
    5.   ws :a*9*:w/2 lw 90
    6.   opu
    7.   powtórz (:h) [
    8.     powtórz (:w) [
    9.       wielokąt [
    10.         ukm "żółty
    11.         powtórz 4 [np (:a*9) pw 90]
    12.       ]
    13.       powtórz 4 [
    14.         powtórz 4 [
    15.           niech "i 5-npw
    16.           wielokąt [
    17.             ukm "czerwony11
    18.             powtórz 2 [
    19.               np (:a*:i) pw 90
    20.               np (:a*5) pw 90
    21.             ]
    22.           ]
    23.         ]
    24.         np :a*9 pw 90
    25.       ]
    26.       pw 90 np :a*9
    27.       lw 90
    28.     ]
    29.     pw 90 ws :a*:w*9
    30.     lw 90 np :a*9
    31.   ]
    32. już

    (7.) Dla każdego wiersza: (8. - 28.) narysuj odpowiednią ilość elementów i (29. - 30.) przejdź wyżej. W celu narysowania fragmentu: (9. - 12.) rysowany jest najpierw duży, żółty kwadrat, a dopiero potem (13. - 25.) dorysowane zostają jego różowe części.

    Zadanie 4

    Kuba trenuje bieganie. Trener Kuby określa tempo przebiegania kolejnych odcinków, podając liczbę, której ostatnia cyfra oznacza tempo przebiegnięcia pierwszego odcinka, przedostatnia – drugiego, itd., …, a pierwsza – ostatniego. Jeśli kolejna cyfra, licząc od prawej strony, jest większa od poprzedniej, to Kuba przyspiesza, jeśli mniejsza – zwalnia, a jeśli taka sama – nie zmienia tempa biegu.

    Napisz jednoparametrową funkcję bieg, której wynikiem jest liczba określająca ile razy, w ciągu całego biegu, Kuba biegł dwa kolejne odcinki w tym samym tempie. Parametrem funkcji jest liczba naturalna, podana przez trenera, nie zawierająca w swym zapisie zer, z zakresu od 11 do 2147483647.

    bieg 653327778jest 3
    bieg 1335544544jest 4

    Rozwiązanie

    Rozwiązanie tego zadania polega na wybieraniu kolejnych par elementów z podanego tekstu i jeśli (4.) są równe to (5.) należy zwiększyć pewien licznik (tutaj :ile). Na koniec (8.) funkcja powinna zwrócić wartość, która znajduje się w liczniku.

    1. oto bieg :s
    2.   niech "ile 0
    3.   powtórz ((długość :s) - 1) [
    4.     jeśli ((element npw :s) = element (npw+1) :s) [
    5.       zwiększ "ile
    6.     ]
    7.   ]
    8.   wynik :ile
    9. już