Sieć metra w mieście Y składa się z wielu linii. Każda z nich biegnie od Centrum do pewnej końcowej stacji na peryferiach. Na każdej linii kursuje jeden pociąg, który w chwili 0 wyrusza z Centrum i pokonuje odcinki między kolejnymi stacjami w czasie 1 minuty. Na stacjach końcowych - na peryferiach i w Centrum pociąg stoi jedną minutę. Czas postoju pociągu na pośrednich stacjach jest zaniedbywalny.
Zdefiniuj funkcję dwuparametrową STACJA :n :linia, której wartością jest nazwa stacji na danej linii, na jakiej powinien znajdować się pociąg po upływie :n minut. Zakładamy, że wartością pierwszego parametru może być dowolna liczba całkowita nieujemna, a drugiego niepusta lista kolejnych stacji - zaczynając od Centrum - na dowolnej linii metra. Oto przykładowe wyniki:
STACJA 0 [Centrum Ratusz Politechnika Uniwersytet Piaski Zalesie Kamraty] | ma wartość: Centrum |
---|---|
STACJA 2 [Centrum Ratusz Politechnika Uniwersytet Piaski Zalesie Kamraty] | ma wartość: Politechnika |
STACJA 15 [Centrum Ratusz Politechnika Uniwersytet Piaski Zalesie Kamraty] | ma wartość: Ratusz |
STACJA 8483 [Centrum Ratusz Politechnika Uniwersytet Piaski Zalesie Kamraty] | ma wartość: Centrum |
Jednym ze sposobów rozwiązania zadania jest przeprowadzenia symulacji: dla każdej minuty wyoknamy ruch kolejką, aż zmienna :n osiągnie 0. Należy tu zwrócić uwagę, że pociąg przemierza całą trasę, czeka 1 minutę, a następnie wraca, czeka minute i dopiero jedzie dalej. Jest to pojedynczy pełny cykl.
Symulację rozpoczynamy od (2.) zadeklarowania zmiennej :a, która oznacza stację na której jest pociąg oraz (3.) :k - określi w którą stronę jedzie pociąg. (4.) Dopóki :n > 0 to: (5.) przesuwamy pociąg na następną stację i (6.) odliczamy czas potrzebny na przebycie. (7.) Jeśli pociąg znajduje się na jednej ze stacji krańcowych to (8.) odliiczamy czas postoju i (9.) zmieniamy kierunek przejazdu. (12.) Na koniec zwracamy nazwę stacji wskazywanej przez zmienną :a.
Kod działa i jest w pełni poprawny. Jednak jego efektywność jest bardzo niska. Im większa wartość :n tym dłużej będą trwały obliczenia. Zadanie można wykonać inaczej. Efektywność kodu poniżej jest całkowicie niezależna od wprowadzonych danych:
(2.) Obliczamy, którą stację w cyklu odwiedza aktualnie pociąg. Można to zrobić w ten sposób, ponieważ pełny cykl to dla linii [1, 2, ..., n] to [1, 2, ..., n, n, ..., 2, 1], dlatego możemy odliczyć wszystkie pełne cykle z przejazdów zawartych w :n. Jednak nie posiadamy drugiej podanej listy, dlatego (3.) sprawdzamy czy pociąg wraca ze stacji n. Jeśli tak to (4.) obliczamy, którą stację od końca odwiedza. Na koniec (6.) zwracamy stację wskazywaną przez :a. Doliczamy tutaj jeden, ponieważ funkcja reszta zwróci wartość od 0 do 2n - 1, którą później zamieniamy na zakres od 0 do n - 1, a numerowanie na liście jest od 1 do n.
Drugie rozwiązanie zadania jest dostępne w zapisie projektu pod nazwą STACJA2.
Poniższy rysunek przedstawia 13 kwadratów rozrzuconych w sposób losowy w polu ograniczonym kwadratową ramką.
Napisz procedurę bez parametrów, o nazwie KWADRATY, która tworzy na ekranie komputera podobny rysunek złożony z losowej liczby od 5 do 15 kwadratów rozrzuconych w sposób losowy w kwadratowym polu ograniczonym ramką:
Trudność zadania polega na odpowiednim losowaniu pozycji kwadratów tak, aby nie wyszły poza obręb większego kwadratu. Przed rozpoczęciem pisania procedury głównej warto napisać funkcję pomocniczą, która pozwoli narysować kwadrat. Będzie przyjmowała trzy argumenty: przesunięcie w poziomie, pionie oraz długość boku kwadratu.
(1.) Przyjmowane argumenty to :l - przesunięcie w poziomie, :d - przesunięcie w pionie oraz :a - długość boku. (2. - 7.) Przesuwamy żółwia gdzie będzie narysowany kwadrat. (8. - 11.) Rysowanie kwadratu i (12. - 18.) żółw zostaje przesunięty tam gdzie był na początku rozpoczęcia funkcji.
Główna funkcja KWADRATY będzie zapisana następująco:
(2.) Ustalenie wysokości i szerokości obrazu wynikowego. (3.) Zmienna :ile określa ile kwadratów będzie w środku dużego kwadratu. (4.) Wyliiczenie długości boku mniejszego kwadratu. (5.) Narysowanie dużego kwadratu, a potem wszystkie małe kwadraty (6. - 8.). Losując pozycję (7.) należy pamiętać, że wylosowana liczba musi być zakresu [0, :h-:a]. W przypadku powyższego kodu trzeba odjąć jeszcze :h/2, aby były prawidłowo wypozycjonowane.
W arabskich budowlach można spotkać mozaiki ułożone z kwadratowych - jasnych i ciemnych kafelków, przedstawiające różne napisy. Mozaika na poniższym rysunku, ułożona z 5 wierszy po 9 ciemnych (widocznych na rysunku) i białych (niewidocznych) kwadratowych kafelków przedstawia słowo Allah, zapisane pismem kufickim.
Następny rysunek przedstawia inny napis kuficki z XIV wieku, pochodzący z meczetu w Aleppo.
Przyjmujemy następujący sposób kodowania mozaikowych napisów, takich jak na przedstawionych rysunkach:
Na przykład:kodem słowa Allah jest lista: [469 341 469 85 125],kodem mozaiki pochodzącej z meczetu w Aleppo jest lista:[2130564575 1342525760 1568430071 1431655761 1430259159 22925317 1564542677 1411240448 2113357499 274584193 1598035643 1147138601 1459689147 1952313865 122953403 1971142664 1426137023 2004181029 1146441405 2004871808 1073745583 1566007977 1431658495 1440694272 1350571349 1440601429 1431655749 2113797501].
Napisz procedurę z jednym parametrem MOZAIKA :kod, która mając dany :kod mozaiki - w postaci listy liczb naturalnych - tworzy na ekranie możliwie duży jej rysunek. Możesz założyć, że mozaika o danym kodzie będzie prostokątem mającym nie mniej niż 4 i nie więcej niż 32 wiersze złożone z od 6 do 32 kwadratowych kafelków.
Trudność zadania polega na przeliczeniu liczb z systemu dziesiętnego na binarny. Na początek należy znaleźć największą liczbę na liście. Pozwoli to na określenie ile kwadratów na szerokość ma mieć rysunek.
(2. - 7.) Szukanie największego elementu na liście.
W celu wyliczenia szerokości należy wyliczyć, która potęga 2 jest większa od największej znalezionej wartości. (8.) Zmienna :w będzie przechowywać, którą potęgą jest aktualna wartość (9.) zmiennej :p. (10.) Dopóki wyliczona potęga jest mniejsza od :max to (11.) zwiększamy numer potęgi :w i zwiększamy wartość :p dwukrotnie.
Znając ile kafelków jest zaszyfrowanych w każdej liczbie można obliczyć (14.) szerokość i (15.) wysokość kafelków tak, aby wypełniły cały ekran. Ze względu na fakt, że kafelki mają być kwadratowe to (16. - 20.) jako bok :a pzryjmujemy mniejszą wyliczoną wartość.
(21. - 26.) Żółw zostaje przesunięty w lewo dolny róg obrazu.
(27.) W pętli żółw rysuje tyle rzędów ile jest liczb na liście. (28.) W i-tej iteracji należy pobrać i-tą liczbę od końca z listy i tymczasowej zmiennej :t przypisać połowę wyliczonej potęgi maksymalnej. (29.) Rysowanie jednego rzędu polega na: (30.) Sprawdzeniu czy aktualna wartość :t jest zawarta w :e. Jeśli tak to (31. - 37.) narysowaniu czarnego kwadratu i (38.) zmniejszeniu :e o wartość :t. Niezależnie od narysowanego kwadratu trzeba (40.) dwukrotnie zmniejszyć wartość :t, która odpowiada za wybieranie kolejnych 0 i 1 zapisu binarnego liczby :e. Po narysowaniu kwadratu (lub też nie): (41. - 45.) należy przesunąć żółwia jeden kwadrat w prawo. (47. - 53.) Na zakończenie rysowania rzędu należy przejść do rysowania następnego.