Harcerski szyfr Czekoladka polega na rysowaniu kolejnych zaszyfrowanych liter danego wyrazu. Aby zaszyfrować literę, rysujemy fragment ramki, w którym ta litera jest zapisana, zgodnie z rysunkami obok. Ponieważ w jednej ramce najczęściej znajdują się dwie litery, kropka pokazuje, czy mamy na myśli literę z lewej, czy z prawej strony. Dla liter T, U, W, Y i Z rysowanie kropki jest zbędne (choć nie jest błędem).
Zdefiniuj procedurę CZEKOLADKA :wyraz, której daną może być słowo utworzone z wielkich liter (wybranych spośród tych, które znajdują się na rysunkach powyżej), o długości od 2 do 30 znaków. Procedura tworzy na środku ekranu rysunek przedstawiający zaszyfrowany wyraz zgodnie z regułami szyfru Czekoladka.
Procedura przedstawia wyraz w postaci graficznej, zgodnie z następującymi zasadami:
Rysunki poniżej przedstawiają efekt wywołania procedury Czekoladka:
Zastanówmy się na początku nad problemem związanym z wyliczeniem wysokości rysunku. Otóż niektóre fragmenty wymagają dwa razy więcej szerokości niż inne. Z tego powodu należy wpierw sprawdzić ile jest takich przypadków. Chociaż nie jest to ujęte w zadaniu warto zauważyć, że litery U i Y wymagają na szerokość połowę wysokości. Z kolei litery T i W wymagają na szerokość tyle samo co np. litera A.
Na początku (2.) ilość szerokości to długość wyrazu. Dopiero potem (3. - 11.) wartość ta jest odpowiednio modyfikowana, aby niektóre litery miały podwójną szerokość, a inne tylko połowę. Następnie (13.) w celu wyliczenia wysokości należy szerokość obrazka podzielić przez wyliczoną ilość szerokości i zsumować z ilością odstępów. Łączną szerokość odstępów można policzyć pomniejszając o jeden liczbę liter, a następnie dzieląc na 4, ponieważ mają mieć szerokości tyle co ćwierć wysokości.
(16. - 19.) Następna część kodu polega na przesunięciu żółwia w miejsce rysowania, a następnie w pęli narysowaniu wszystkich kolejnych liter. W celu uproszczenia zapisu kodu wykorzystana została tutaj składnia wybierz i zadeklarowana została dodatkowa procedura CZEKOLADKA_prost, która zapewnia wygodny sposób rysowania prostokątów. (78. - 81.) Po narysowaniu litery należy zawsze przesunąć żółwia o odstęp w prawo.
W celu narysowania prostokątów procedura korzysta z procedury CZEKOLADKA_prost, która przyjmuje trzy argumenty: :h - aktualna wysokość elementów, :l - lista cyfr, które boki mają być widoczne (począwszy od lewego zgodnie ze wskazówkami zegara, 0 oznacza nie wyświetlaj, a 1 rysuj) oraz :k - określa po której stronie narysować kropkę (0 po lewej, 1 po prawej). Kod procedury wygląda następująco:
Wykorzystana funkcja CZEKOLADKA_TEST ma za zadanie uprościć proces podnoszenia i opuszczania pisaka. Dla przekazanej wartości 0 podnosi pisak, a dla 1 go opuszcza.
Asia bada liczby pierwsze. Dowiedziała się, że jest ich bardzo dużo, ale na przykład zero i jedynka nie są liczbami pierwszymi. Pewnego dnia w encyklopedii znalazła następującą definicję: "Liczbami pomiędzy pierwszymi nazywamy liczby będące średnią arytmetyczną kolejnych dwóch liczb pierwszych większych od 2 (ang. interprime numbers). Pięć najmniejszych liczb pomiędzy pierwszymi to: 4, 6, 9, 12, 15.".
Pomóż Asi wyszukać liczby pomiędzy pierwszymi. Napisz funkcję LLPP :pocz :kon, która zliczy wszystkie liczby pomiędzy pierwszymi większe od :pocz i jednocześnie mniejsze od :kon. Parametr :pocz jest liczbą większą od zera, a parametr :kon jest liczbą mniejszą lub równą 10000.
LLPP 5 7 | jest 1 (bo 6 jest liczbą pomiędzy pierwszymi) |
---|---|
LLPP 7 16 | jest 3 (bo 9, 12 i 15 są liczbami pomiędzy pierwszymi) |
Poniżej został przedstawiony kod funkcji, która dla podanej liczby :a zwraca czy jest to liczba pierwsza. O działaniu tego algorytmu można poczytać w artykule o liczbach pierwszych.
Wyszukiwanie kolejnych liczb pomiędzy pierwszymi będzie polegało na znalezieniu każdej kolejnej pary liczb pierwszych. Dodać do wyniku o ile znajduje się w zakresie. Warunkiem stopu będzie uzyskanie liczby, która jest większa od górnego zakresu przeszukiwania.
Do przechowywanie aktualnej pary liczb pierwszych będą służyć zmienne :a i :b. Ich początkowe wartości (2. - 3.) to 2 i 3. (4.) Wystąpienia kolejnych liczb pomiędzy pierwszymi będą zliczane w zmiennej :ile. (5.) W nieskończonej pętli każda kolejna iteracja zaczyna się od (6. - 10.) wyszukania nowej pary liczb pierwszych. Następnie (11.) wyliczeniu aktualnej wartości liczby specjalnej i (12. - 14.) jeśli wykracza poza zakres to należy zwrócić aktualny wynik. (15. - 17.) W przeciwnym wypadku jeśli liczba jest w zakresie to należy zwiększyć zmienną :ile.
Staś interesuje się dużymi liczbami. Zastanawiał się, czy jest możliwe, aby po pomnożeniu cyfr dużej liczby otrzymać liczbę pierwszą.
Pomóż Stasiowi rozwiązać ten problem. Napisz funkcję ICP :x, której daną :x jest niepuste słowo złożone wyłącznie z cyfr (maksymalnie 100 cyfr), a wynikiem wartość logiczna prawda, gdy iloczyn cyfr danej :x jest liczbą pierwszą, a fałsz, gdy iloczyn cyfr danej :x nie jest liczbą pierwszą.
ICP "121 | jest "prawda |
---|---|
ICP "999 | jest "fałsz |
Wyliczenie iloczynu wszystkich cyfr podanej liczby polega na wybieraniu ostatniej cyfry mnożeniu aktualnego iloczynu przez nią, a następnie usunięciu ostatniej cyfry. Ostateczny wynik można podać zwracając wynik funkcji czyPierwsza?, która została opisana w zadaniu 2. Kod przedstawia się następująco:
Jak wiadomo liczba pierwsza to taka liczba, która w rozkładzie na czynniki pierwsze ma tylko dwa dzielniki: pierwszy to 1 oraz drugi to samą siebie. Przypuśćmy, że liczba a to iloczyn cyfr przekazanych do funkcji. Oznacza to, że każda cyfra to liczba z rozkładu a na czynniki pierwsze.