Kolejnym cyfrom odpowiadają obrazki przedstawione na rysunkach poniżej:
Napisz procedurę OL :s, która tworzy na środku ekranu rysunek zaszyfrowanej liczby reprezentowanej przez parametr :s. Parametr :s jest słowem złożonym z minimalnie 2, a maksymalnie 40 cyfr. Odstęp pomiędzy szyfrowanymi cyframi wynosi połowę szerokości cyfry 0. Szerokość całego rysunku wynosi 720.
Jak można zauważyć z przedstawionych rysunków cyfry od 0 do 8 powstają poprzez dodawanie zaledwie jednego elementu i jedynie cyfra 9 nie jest kwadratem i w żaden sposób się nie łączy. Jednym z pomysłów na narysowanie tych figur jest napisania procedury OL_Element, która na podstawie wybranej cyfry wybiera co narysować i potrafi dla każdej cyfry mniejszej od 9 wywołać funkcję dla poprzedniej cyfry.
W celu szybszego powrotu do punktu początkowego rysowania (2.) zapamiętywana jest pozycja przed rozpoczęciem rysowania i żółw (3;) zawsze jest skierowany do góry, aby uniknąć problemów powstałych wskutek obracania podczas rysowania.
W celu poprawnego narysowania na początku (2. - 10.) wyliczana jest łącza liczba długości podstaw figur oraz przestrzeni pomiędzy nimi. Na podstawie tej wartości jest (11.) wyliczany bok :a kwadratu cyfr od 0 do 8.
Po obliczeniu boku :a procedura (12. - 15.) przechodzi w lewy dolny róg rysunku i (16. - 22.) rysuje wszystkie cyfry. Wykorzystany zostaje tu fakt, że procedura OL_Element rozpoczyna rysowanie cyfry w jej lewym dolnym rogu, a kończy w prawym dolnym.
Napisz funkcję IleCyfr :liczba :podstawa, której wynikiem jest liczba cyfr liczby podanej jako pierwszy parametr w układzie o podstawie podanej jako drugi parametr. Parametr :liczba jest nieujemną liczbą całkowitą zapisaną w układzie dziesiętnym nie większą niż 1020, parametr :podstawa jest liczbą całkowitą większą od 1 i mniejszą niż 17.
IleCyfr 123456 10 | jest 6 |
---|---|
IleCyfr 1 5 | jest 1 |
IleCyfr 255 2 | jest 8 |
IleCyfr 255 16 | jest 2 |
Podczas zapisywania liczby w innej podstawie najpierw należy wyznaczyć liczbę najbardziej znaczącą czyli pierwszą od lewej. Jej wartość to :podstawa podniesiona do pozycji liczby od prawej - 1. Oto kod znajdujący taką potęge p, że jest mniejsza od :liczba. Zmienna :ile przechowuje, która to jest potęga.
Alicja, Tomek i Zuzanna planują wakacyjny wyjazd. Podczas podróży odwiedzą od 2 do 7 miejscowości. Ustalili już wspólną listę tych miejscowości, mają jednak problem z wyborem kolejności odwiedzanych miejsc. Każde z dzieci ma swoje preferencje.
Na przykład Alicja chce odwiedzić najpierw Poznań, potem Łódź i Kraków, a na końcu Warszawę (PŁKW). Tomek chce odwiedzić najpierw Warszawę, potem Poznań, następnie Łódź, na końcu Kraków (WPŁK). Zuzanna chciałaby, żeby zacząć od Poznania, potem pojechać do Warszawy, Krakowa, a Łódź zostawić na koniec (PWKŁ).
Pomóż im podjąć decyzję tak, aby zaproponowana kolejność odwiedzania miast różniła się jak najmniej od preferowanej przez każdego uczestnika wycieczki. Ocenę rozwiązania znajdujemy licząc łączną liczbę par miast występujących w dwóch propozycjach w innej kolejności.
Na przykład kolejność Alicji to PŁKW, Tomka - WPŁK, Zuzanny - PWKŁ. Najlepsza ocena (minimalna łączna liczba zmian kolejności miejscowości) to 4, a najlepszy wybór to PWŁK, ponieważ dla Alicji oznacza to dwie zmiany kolejności (Kraków - Warszawa i Łódź - Warszawa), dla Tomka jedną (Warszawa - Poznań) i dla Zuzanny też jedną (Kraków - Łódź).
Napisz funkcję Miasta :A :T :Z, której wynikiem dla danej preferencji trójki osób będzie słowo reprezentujące kolejność odwiedzanych miejscowości o najlepszej ocenie. Jeśli kilka kolejności ma taką samą ocenę, wynikiem funkcji może być dowolna z nich.
Parametry :A, :T, :Z (a także wynik funkcji) są słowami tej samej długości reprezentującymi kolejność odwiedzania miejscowości, wszystkie dzieci wskazują te same miejscowości reprezentowane przez pojedyncze litery. Nazwy miejscowości zaczynają się od różnych liter.
Miasta "PŁKW "WPŁK "PWKŁ | jest PWŁK |
---|---|
Miasta "TSG "TGS "GST | jest TGS |
W celu znalezienia optymalnego rozwiązania warto wyznaczyć wszystkie możliwe kombinacje ustawień kolejności miast. Następnie dla każdego z ustawień wybrać to, które będzie miało najmniejszą różnicę z planami Alicji, Tomka i Zuzanny.
Rozpocznijmy najpierw od zliczania różnic pomiędzy dwoma planami. Najprostszym sposobem jest wybór każdej możliwej pary miast, a następnie sprawdzenie ile z nich nie jest w tej samej kolejności co w planie. W celu wybrania par wystarczą dwie pętle.
(2.) Początkowo licznik potrzebnych zmian to 0. Potem (3.) dla każdego kolejnego miasta: (4.) zapamiętujemy, które. Potem (5.) dla każdego miasta w planie dalej położonym od poprzednia wybranego: (6.) zapamiętuje pozycję drugiego wybranego elementu. Jesli (7. - 8.) pozycję wybranych elementów w planie są w odwrotnej kolejności to (9.) zwiększ licznik :ile. Na koniec (13.) zwróć wartość :ile.
Generowanie wszystkich możliwych planów odbywa się w sposób rekurencyjny. Funkcja Miasta_Generuj przyjmuje kolejno: :miasta - aktualna lista miast do ustalenia ich kolejności, :plany - plany uczestników wycieczki, :plan - aktualnie wybrany plan podróży oraz :wynik - aktualnie najlepsze rozwiązanie. Wynik to lista złożona z dwóch elementów: pierwszy to liczba potrzebnych zmian, a drugi to plan wycieczki. Kiedy :wynik nie jest ustalony to ma wartość [-1].
Kiedy (2.) plan zostanie ustalony to (3.) przyjmij, że nie potrzeba zmian, a potem (4. - 8.) dla każdego uczestnika wycieczki wylicz różnicę i dodaj do :wartosc. Potem (9. - 11.) jeśli jest to lepszy plan lub plan nie został ustalony to ustal jako aktualny najlepszy wybór. Jednak kiedy plan jest jeszcze ustalany to: (13.) dla każdego :miasta: (14.) wybierz miasto, (15.) utwórz tymczasowy wybór miast bez tego wybranego i (16.) zacznij generować jego pozostałą część.
W głównej funkcji pozostaje teraz: (2.) utworzyć listę planów każdego z uczestników, a następnie (3.) zwrócić ostatni element wyniku funkcji Miasta_Generuj. Podczas wywoływania jako :miasta podajemy dowolny plan wycieczki, jako :plany utworzoną listę, jako :plan puste słowo, a za :wynik domyślną wartość [-1].