Strona główna » Poradniki » Logomocja » LOGIA » Logia 2016/17 Etap I
 

Logia 2016/17 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ę BRAMA, po wywołaniu której na ekranie powstanie rysunek taki, jak poniżej. Szara podstawa bramy ma wysokość 24 i szerokość 624. Wielkości pozostałych elementów odczytaj z rysunku pomocniczego.

Rysunek Pomocniczy
BRAMA

Rozwiązanie

W zadaniu powtarza się jedynie mały i duży słup i te fragmenty kodu można przepisać jako dodatkowego procedury. Pozwoli to na napisanie bardziej zwięzłego kodu. Oto kolejne procedury, które rysują mały i duży słup o zadanej szerokości :a.

  1. oto brama_malyslup :a
  2.   lw 90
  3.   prostokat :a*5 :a "czerwony
  4.   np :a*5 lw 90
  5.   np :a pw 90
  6.   prostokat :a :a*3 "czerwony
  7.   np :a lw 90
  8.   np :a pw 90
  9.   niech "b (:a*5)/pwk(2)
  10.   wielokąt [
  11.     ukm "czerwony
  12.     pw 45 np :b
  13.     pw 90 np :b
  14.   ]
  15.   pod
  16.   ws :a*6 pw 90
  17.   np :a*2
  18.   opu
  19. już
  1. oto brama_duzyslup :a
  2.   lw 90
  3.   prostokat :a*15 :a*2 "czerwony
  4.   np :a*14
  5.   prostokat (-:a) (-:a) "czerwony
  6.   pod
  7.   pw 90 np :a*2
  8.   opu
  9.   prostokat :a :a "czerwony
  10.   lw 90 ws :a*14
  11.   pw 90 ws :a*2
  12. już

Obydwie powyższe procedury korzystają z procedury prostokat do narysowania prostokątów.

  1. oto brama
  2.   niech "a 24
  3.   niech "d :a*pwk(2)
  4.   pod
  5.   ws :a*19/2 pw 90
  6.   ws :a*13 lw 90
  7.   opu
  8.   wielokąt [
  9.     ukm "szary
  10.     powtórz 2 [
  11.       np :a pw 90
  12.       np (:a*26) pw 90
  13.     ]
  14.   ]
  15.   np :a pw 90
  16.   np :a brama_malyslup :a
  17.   np :a*3 brama_duzyslup :a
  18.   np :a*4 brama_malyslup :a
  19.   np :a*9 brama_malyslup :a
  20.   np :a*3 brama_duzyslup :a
  21.   np :a*4 brama_malyslup :a
  22.   pod
  23.   np :a*2 lw 90
  24.   np :a*12 lw 90
  25.   opu
  26.   wielokąt [
  27.     ukm "czerwony
  28.     np (:a*26) pw 135
  29.     np :d pw 45
  30.     np (:a*24)
  31.   ]
  32.   pod
  33.   ws :a pw 90
  34.   np :a*5 lw 90
  35.   opu
  36.   wielokąt [
  37.     ukm "czerwony
  38.     np (:a*28) lw 135
  39.     np (:d*2) lw 45
  40.     np (:a*24)
  41.   ]
  42.   ws :a
  43.   wielokąt [
  44.     ukm "czerwony
  45.     np (:a*30) pw 135
  46.     np :d pw 45
  47.     np (:a*28)
  48.   ]
  49. już

Brama będzier rysowana od dolnej podstawy do górnej. Bardzo ważne, aby pamiętać, że najpierw należy narysować słupy, a dopiero później poziome elementy bramy. Oto kod procedury:

  1. oto brama
  2.   niech "a 24
  3.   niech "d :a*pwk(2)
  4.   pod
  5.   ws :a*19/2 pw 90
  6.   ws :a*13 lw 90
  7.   opu
  8.   wielokąt [
  9.     ukm "szary
  10.     powtórz 2 [
  11.       np :a pw 90
  12.       np (:a*26) pw 90
  13.     ]
  14.   ]
  15.   np :a pw 90
  16.   np :a brama_malyslup :a
  17.   np :a*3 brama_duzyslup :a
  18.   np :a*4 brama_malyslup :a
  19.   np :a*9 brama_malyslup :a
  20.   np :a*3 brama_duzyslup :a
  21.   np :a*4 brama_malyslup :a
  22.   pod
  23.   np :a*2 lw 90
  24.   np :a*12 lw 90
  25.   opu
  26.   wielokąt [
  27.     ukm "czerwony
  28.     np (:a*26) pw 135
  29.     np :d pw 45
  30.     np (:a*24)
  31.   ]
  32.   pod
  33.   ws :a pw 90
  34.   np :a*5 lw 90
  35.   opu
  36.   wielokąt [
  37.     ukm "czerwony
  38.     np (:a*28) lw 135
  39.     np (:d*2) lw 45
  40.     np (:a*24)
  41.   ]
  42.   ws :a
  43.   wielokąt [
  44.     ukm "czerwony
  45.     np (:a*30) pw 135
  46.     np :d pw 45
  47.     np (:a*28)
  48.   ]
  49. już

W kodzie wartość 24 została przypisana do :a. Oznacza to, że możliwe jest narysowanie bramy większej / mniejszej.

Zadanie 2

Napisz jednoparametrową procedurę/funkcję RAMA, po wywołaniu której na środku ekranu powstanie kwadratowa ramka, taka jak poniżej. Parametr określa liczbę elementów tworzących bok ramki (patrz rysunek pomocniczy) i może przyjmować wartości od 1 do 12. Wysokość rysunku jest stała i wynosi 480.

Rysunek pomocniczy
RAMKA 1
RAMKA 3
RAMKA 4

Rozwiązanie

Uproszczenie kodu polega na rozbiciu go na dwie procedury: główną do rysowania całego wzoru oraz pomocniczej do rysowania pojedynczego elementu o pewnej szerokości :a. Kod procedury do rysowania pojedynczego elementy wygląda następująco:

  1. oto rama_el :a
  2.   niech "d :a*pwk(2)
  3.   wielokąt [
  4.     ukm "czarny
  5.     np :a pw 90
  6.     np (:a*7) lw 90
  7.     np :a pw 90
  8.     np :a pw 90
  9.     np (:a*2) pw 90
  10.     np (:a*8) pw 90
  11.   ]
  12.   pod
  13.   np :a*3 pw 90
  14.   np :a*3 lw 90
  15.   opu
  16.   wielokąt [
  17.     ukm "czarny
  18.     lw 45
  19.     np :d pw 45
  20.     np (:a*2) pw 90
  21.     np (:a*7) pw 45
  22.     np :d pw 135
  23.     np (:a*7) lw 90
  24.     np (:a*2)
  25.   ]
  26.   pod
  27.   pw 90 np :a
  28.   lw 90
  29.   opu
  30.   wielokąt [
  31.     ukm "czarny
  32.     np :a pw 90
  33.     np (:a*3) pw 45
  34.     np :d pw 135
  35.     np (:a*4)
  36.   ]
  37.   pod
  38.   ws :a*3 pw 90
  39.   np :a*6 lw 90
  40.   opu
  41.   wielokąt [
  42.     ukm "czarny
  43.     lw 45
  44.     np :d pw 45
  45.     np (:a*3) pw 90
  46.     np :a pw 90
  47.     np (:a*4)
  48.   ]
  49. już

Wtedy główna procedura upraszcza się do następującej postaci. Tutaj bardzo ważne jest wyliczenie szerokości :a w linijce (3.)

  1. oto rama :n
  2.   niech "w 480
  3.   niech "a :w/(:n*11 + 7)
  4.   pod
  5.   ws :w/2 pw 90
  6.   ws :w/2 lw 90
  7.   opu
  8.   powtórz 4 [
  9.     wielokąt [
  10.       ukm "czarny
  11.       powtórz 2 [
  12.         np (:a*7) pw 90
  13.         np :a pw 90
  14.       ]
  15.     ]
  16.     powtórz :n [
  17.       rama_el :a
  18.       pod
  19.       pw 90 np :a lw 90
  20.       opu
  21.     ]
  22.     pod
  23.     pw 90 np :a*7
  24.     lw 180
  25.     opu
  26.   ]
  27. już

Zadanie 3

Jaś wydaje własne książki. Każda strona jest numerowana kolejnymi liczbami, pierwsza strona ma numer 1. Jeśli w numerze strony występuje 13 (tj. cyfra 1, a bezpośrednio po niej cyfra 3), to drukuje te cyfry kolorem złotym. Napisz jednoparametrową funkcję ILE, której parametrem jest liczba stron książki wydanej przez Jasia, a wynikiem liczba cyfr wydrukowanych kolorem złotym. Parametr może przyjmować wartości od 10 do 15000.

ile 152
ile 19924

Rozwiązanie

Do rozwiązania wystarczy jedna pętla oraz funkcja numel. Należy jednak pamiętać, że rozpoczynamy sprawdzanie od 10, więc będzie :n - 10 powtórzeń. Ponadto należy pamiętać, że może występować więcej niż jedna liczba 13. Zgodnie z zadaniem np. liczba 1313 będzie całkowicie wydrukowana kolorem złotym.

  1. oto ile :n
  2.   niech "w 0
  3.   dopóki [:n >0][
  4.     niech "k :n
  5.     dopóki [:k >= 10][
  6.       jeśli (reszta :k 100 = 13) [
  7.         niech "w :w + 2
  8.       ]
  9.       niech "k int(:k / 10)
  10.     ]
  11.     zmniejsz "n
  12.   ]
  13.   wynik :w
  14. już