Szyfr Bacona polega na zastępowaniu liter alfabetu łacińskiego pięcioznakowymi ciągami złożonymi z liter a i b zgodnie z poniższą tabelą:
A | B | C | D | E | F | G | H | I, J | K | L | M |
---|---|---|---|---|---|---|---|---|---|---|---|
aaaaa | aaaab | aaaba | aaabb | aabaa | aabab | aabba | aabbb | abaaa | abaab | ababa | ababb |
N | O | P | Q | R | S | T | U, V | W | X | Y | Z |
---|---|---|---|---|---|---|---|---|---|---|---|
abbaa | abbab | abbba | abbbb | baaaa | baaab | baaba | baabb | babaa | babab | babba | babbb |
Adaś postanowił szyfrować kolejne litery słowa. Zamiast liter a i b użył odpowiednio zamalowanych kwadratów:
Napisz jednoparametrową procedurę/funkcję szyfruj, po wywołaniu której na środku ekranu powstanie rysunek zaszyfrowanego słowa (od lewej do prawej). Parametrem jest niepuste słowo złożone z wielkich liter alfabetu łacińskiego o maksymalnej długości 70. Szerokość rysunku wynosi 700 lub wysokość wynosi 400. Do zamalowania użyj dwóch dowolnych kolorów różnych od koloru krawędzi kwadratów.
Przyjmijmy, że litera a oznacza cyfrę 0, a litera b cyfrę 1. Wtedy każdej literze przyporządkowywujemy jej pozycję w alfabecie pomniejszona o jeden zapisaną binarnie. Przykładowo litera C ma 00010 co w zapisie binarnym to liczba dziesiętna 2, a litera C to trzecia litera alfabetu. W myśl tej zasady litera A ma indeks 0. Oczywiście należy pamiętać, że dla liter położonych dalej niż I zmniejszać indeks o 1, a od litery V pomniejszyć o jeszcze jeden.
Każda rysowana litera zostaje zamieniona wpierw na kod zero jedynkowy, a dopiero na podstawie kodu wartości są rysowane. W celu zamiany
(2.) Sprawdź pozycję litery w alfabecie i (3. - 4.) skoryguj jej wartość jeśli istnieje taka potrzeba. Następnie (5. - 12.) przelicz liczbę dziesiętną na postać binarną i (13.) zwróć zapis jako tekst. Warto tutaj zauważyć, że niezależnie od wartości zawsze zwracane jest pięć cyfr.
Funkcja główna szyfruj początkowo ustala rozmiar pojedynczego kwadracika, a następnie dla każdej litery generuje kod i na jego podstawie rysuje obrazek.
(2.) Sprawdź ile jest liter i (3. - 5.) określ rozmiar najmniejszego kwadratu tj. bok :a. (6. - 9.) Przejdź do lewego, dolnego rogu. Następnie (10.) dla każdej litery: (11.) określ jej kod, (12. - 21.) narysuj kolumnę i (22. - 25.) przejdź do następnej.
Logolandia ma tylko jedną owalną ulicę, przy której stoją domy podzielone na osiedla. Dwa domy stojące obok siebie są w jednym osiedlu, jeśli różnica ich numerów jest nie większa niż 3. Dom o największym numerze jest w tym samym osiedlu, co dom o numerze 1, 2 lub 3 (o ile istnieje). W Logolandii stoją co najmniej 2 domy, ale nie więcej niż 10 000. Największy numer domu jest nie większy niż 30 000. Numery domów nie powtarzają się.
Napisz jednoparametrową funkcję maksos, której parametrem jest uporządkowana rosnąco lista numerów domów. Wynikiem jest liczba domów w osiedlu składającym się z największej liczby domów.
maksos [1 4 7 11 13 14 15 16 20] | jest 5 (osiedle 11-13-14-15-16) |
---|---|
maksos [1 4 7 13 14 15 20] | jest 4 (osiedle 20-1-4-7) |
W celu powiązania ze sobą domów najlepiej, aby lista numerów domu była uporządkowana (rosnąco lub malejąco). Wtedy kolejne domy powinny zostać dokładne na listę tak długo, aż numer poprzedniego domu nie różni się o więcej niż 3. Jeśli się różni to licznik należy zapamiętać i rozpocząć nowe liczenie od aktualnego domu. Na koniec należy wybrać licznik, który ma największą wartość. Uwaga: należy pamiętać, aby sprawdzić czy do pierwszego osiedla pasują domy z końca listy (planasza ma kształt owalu).
W funkcji maksos osiedle o (2.) największej ilości domów jest umieszczone w zmiennej :max, a (3.) w zmiennej :ile aktualna wartość domów w osiedlu.
Staś układa na stole sześcienne klocki tej samej wielkości. Na każdym widnieje jedna z wielkich liter alfabetu łacińskiego. Klocki układane są rzędami (wierszami). Każdy rząd rozpoczyna się przy lewej krawędzi stołu. Pierwszy rząd zawiera jeden klocek, drugi – dwa, trzeci – trzy, …, itd. Ostatni rząd może być krótszy.
Napisz jednoparametrową funkcję kolit, której parametrem jest niepuste słowo długości co najwyżej 1 000, zawierające litery widniejące na kolejnych klockach. Wynikiem funkcji jest liczba tych kolumn w układance Stasia, w których wszystkie litery są identyczne.
kolit "ABCDEFGH | jest 1 (ostatnia kolumna) |
---|---|
kolit "ALAMAKRABY | jest 2 (druga i ostatnia) |
Zadanie zostanie podzielone na kilka etapów. Pierwszy będzie polegał na podzieleniu słowa na listę znaków w następujący sposób: przygotuj pustą listę. W liście umieść nową pustą listę. Następnie dla każdej listy w głównej liście dopisz kolejny znak ze słowa. Czynność tę powtarzaj dopóki pozostaną niewybrane znaki z słowa. W ten sposób w i-tej liście znajdą się znaki z i-tej kolumny. Następnie wystarczy sprawdzić ile jest list, które mają wszystkie znaki identyczne.
Do sprawdzenia czy na liście wszystkie elementy są identyczne służy funkcja kolit_sprawdz. Zwraca ona wartość logiczną.
(2.) Dla pustej liście nie ma żadnego elementu, więc nie mogą być identyczne. Należy wtedy zwrócić fałsz. W przeciwnym wypadku (3.) pobierz pierwszy znak i (4. = 8.) porównaj go z każdym pozostałym elementem. Jeśli choć raz elementy będą się różnić to zwróć fałsz w przeciwnym wypadku (9.) zwróć prawdę.
Przed przystąpieniem do obliczeń należy: (2.) przygotować pustę listę i (3.) określić, który znak zostaje wybrany (tj. od pierwszego). Następnie (4. - 14.) podziel słowo na listę elementów w każdej z kolumn i (15. - 20.) policz ile jest list na których elementy są identyczne. Na koniec (21.) zwróć wartość zmiennej :licznik.
(2.) Dla pustej liście nie ma żadnego elementu, więc nie mogą być identyczne. Należy wtedy zwrócić fałsz. W przeciwnym wypadku (3.) pobierz pierwszy znak i (4. = 8.) porównaj go z każdym pozostałym elementem. Jeśli choć raz elementy będą się różnić to zwróć fałsz w przeciwnym wypadku (9.) zwróć prawdę.