Strona główna » Poradniki » Logomocja » LOGIA » Logia 2001/02 - Etap II

Logia 2001/02 - Etap II

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

Zadanie 1

Zdefiniuj procedurę bez parametrów, o nazwie PARKIET, która tworzy na środku ekranu możliwie duży rysunek, taki jak na rysunku poniżej:

Rozwiązanie tego zadania jest niedostępne

Objaśnienie do treści zadań 2 i 3

Pionek (żółw) porusza się ruchem konika szachowego po nieskończonej kwadratowej siatce punktów jak na rysunku poniżej:

Pionek, znajdując się w dowolnym punkcie siatki, może zawsze wykonać jeden z ośmiu ruchów. Ruchy te numerujemy i opisujemy następująco:

  • ruch numer 1 - o 2 oczka w górę i o 1 w prawo,
  • ruch numer 2 - o 1 oczko w górę i o 2 w prawo,
  • ruch numer 3 - o 1 oczko w dół i o 2 w prawo,
  • ruch numer 4 - o 2 oczka w dół i o 1 w prawo,
  • ruch numer 5 - o 2 oczka w dół i o 1 w lewo,
  • ruch numer 6 - o 1 oczko w dół i o 2 w lewo,
  • ruch numer 7 - o 1 oczko w górę i o 2 w lewo,
  • ruch numer 8 - o 2 oczka w górę i o 1 w lewo.

Każdą drogę żółwia po siatce można zakodować w postaci liczby, w której występują wyłącznie cyfry od 1 do 8 - numery kolejnych ruchów.Na przykład:

  • kodem drogi pionka od punktu A do punktu B (popatrz na rysunek na dole) jest liczba 12318,
  • kodem drogi po śladach w przeciwnym kierunku od B do A jest liczba 45765,
  • kodem planu wędrówki od punktu A do C - symetrycznej do trasy od A do B względem pionowej osi symetrii przechodzącej przez punkt startu A jest liczba 87681,
  • kodem drogi po śladach w przeciwnym kierunku od C do A jest liczba 54234.

Zadanie 2

Zdefiniuj procedurę DROGA :kd, która dla danego kodu drogi, narysuje tę drogę na ekranie. Załóż, że punktem startu jest środek ekranu. Siatki kwadratowej nie musisz rysować.

DROGA 12318jest łamana łącząca punkty A i B na powyższym rysunku, przy czym punkt A odpowiada środkowi ekranu.
DROGA 45765jest łamana łącząca punkty A i B na powyższym rysunku, przy czym punkt B odpowiada środkowi ekranu.

Strategia

Rozwiązanie zadania powinno wykonywać zadanie i nie być trudne do zrozumienia. Z tego powodu listę dostępnych ruchów najlepiej przechowywać jako listę dostępnych przesunięć. Rysowanie ścieżki będzie się odbywać poprzez wybieranie przesunięcia wskazanego przez i-tą cyfrę.

Kod

Kod głównej funkcji DROGA wygląda następująco:

  1. oto DROGA :kd
  2.   niech "listaRuchów [[2 1] [1 2] [-1 2] [-2 1] [-2 -1] [-1 -2] [1 -2] [2 -1]]
  3.   niech "kd (słowo :kd)
  4.   niech "a 20
  5.   powtórz (długość :kd) [
  6.     niech "przesX :a * ost element (element npw :kd) :listaRuchów
  7.     niech "przesY :a * pierw element (element npw :kd) :listaRuchów
  8.     ustalXY (pozX + :przesX) (pozY + :przesY)
  9.   ]
  10. już

(2.) Deklaracja dostępnych przesunięć i (3.) wymuszenie przekonwertowania liczby na słowo. (4.) Ustalenie rozmiaru siatki po której porusza się żółw. (5.) Dla każdej cyfry (6. - 7.) i współrzędnej wylicz iloczyn :a i wartości przesunięcia w danej osi. (8.) Dokonaj przesunięcia.

Zadanie 3

Zdefiniuj funkcję WSPAK :kd, która dla danego kodu drogi znajduje kod drogi po śladach w przeciwnym kierunku od końca do początku. Poniżej przedstawiamy przykładowe wyniki:

WSPAK 12318jest liczba 45765
WSPAK 45765jest liczba 12318
WSPAK 87681jest liczba 54234

Rozwiązanie

Rozwiązanie tego zadania jest bardzo podobne do poprzedniego rozwiązanie. Różni się interpretacją odczytanych danych.

  1. oto WSPAK :kd
  2.   niech "listaRuchów [[2 1] [1 2] [-1 2] [-2 1] [-2 -1] [-1 -2] [1 -2] [2 -1]]
  3.   niech "kd (słowo :kd)
  4.   niech "w "
  5.   powtórz (długość :kd) [
  6.     niech "el element (element npw :kd) :listaRuchów
  7.     niech "odwr (lista ((pierw :el) * -1) ((ost :el) * -1))
  8.     niech "w nak :w numel :odwr :listaRuchów
  9.   ]
  10.   wynik :w
  11. już

(2.) Deklaracja dostępnych przesunięć i (3.) wymuszenie przekonwertowania liczby na słowo. (4.) Zadeklaruj puste słowo wynikowe. (5.) Dla każdej cyfry (6.) pobierz element, a następnie (7.) odwróć jego współrzędne. Ze względu na fakt, że kod ma być wspak to obie współrzędne należy pomnożyć razy -1. (8.) Na koniec każdej iteracji dopisz pozycję takiego przesunięcia na liście dostępnych ruchów. Na koniec (10.) zwróć zmienną :w.