Zadania trzeciego etapu Mazowieckiego Konkursu Informatycznego dla gimnazjalistów LOGIA 03

Zadanie 1.

Zdefiniuj procedurę GWIAZDY :kod rysującą gwiazdozbiór składający się z gwiazd.
Każda gwiazda składa się z pęku ramion-odcinków o tej samej długości, równomiernie rozmieszczonych wokół środka gwiazdy.
Każda gwiazda może posiadać własne gwiazdy-satelity - są one rysowane na przedłużeniu każdego ramienia gwiazdy-matki. Długość ramienia gwiazdy-satelity równa jest jednej trzeciej długości ramienia gwiazdy-matki. Odległości środków gwiazdy-matki i gwiazdy-satelity są równe podwójnej długości ramienia gwiazdy-matki.
Gwiazdy-satelity mogą posiadać swoje własne gwiazdy-satelity, itd.
Centralna gwiazda układu jest rysowana na środku ekranu. Jej ramiona mają losową długość, nie mniejszą niż 20 i nie większą niż 80.
Dana :kod może być liczbą lub listą:

  • gdy jest liczbą - reprezentuje pojedynczą gwiazdę bez satelitów - jej wartość określa liczbę ramion,
  • gdy jest listą - reprezentuje gwiazdę z satelitami - liczba elementów listy określa wówczas liczbę ramion gwiazdy-matki (będącą jednocześnie liczbą gwiazd-satelitów); poszczególne elementy tej listy (które także są liczbami lub listami) określają wygląd gwiazd-satelitów.

Gwiazdy należy rysować w losowych kolorach, ale wszystkie ramiona danej gwiazdy muszą być rysowane tym samym kolorem. Zakładamy, że dana :kod określa rysunek, w którym poszczególne gwiazdy nie nachodzą na siebie.

Przykład pokazuje rysunek jaki może powstać po wywołaniu
Gwiazdy [12 6 6 [77 5 5 5 5 [3 3 3 3 3] 4 4 4] 24]

Zadanie 2.

Zdefiniuj procedurę DOM :a :h :kod rysującą dom składający się z parteru, pięter i dachu. Każda kondygnacja domu jest szarym prostokątem, o tej samej wysokości, zawierającym okna i drzwi (drzwi - tylko parter). Dach stanowią kominy.

Dana :a określa szerokość domu, :h - wysokość (bez dachu). Dana :kod jest listą słów złożonych z małych liter alfabetu łacińskiego (bez polskich znaków diakrytycznych). Pierwszy element listy opisuje parter, ostatni - dach, inne – piętra, w kolejności od dołu ku górze. Każde słowo opisuje wygląd jednej kondygnacji. Poszczególne litery mają następujące znaczenie:

    Parter:
    • spółgłoski g, j, p, q określają "drzwi zamknięte" - brązowy prostokąt,
    • pozostałe spółgłoski to "okna zamknięte" - brązowe kwadraty,
    • samogłoska y określa "drzwi otwarte" - żółty prostokąt,
    • pozostałe samogłoski to "okna otwarte" - żółte kwadraty.
    Piętro:
    • wszystkie spółgłoski - "okna zamknięte",
    • wszystkie samogłoski - "okna otwarte".
    Dach:
    • litery b, d, f, h, k, l, t - "kominy wysokie" - czarne prostokąty,
    • pozostałe litery - "kominy niskie" - czarne kwadraty.

Bok kwadratu (okna, niskiego komina) powinien być maksymalnie duży, ale nie większy niż jedna trzecia wysokości kondygnacji. Okna, drzwi i kominy nie mogą nachodzić na siebie. Prostokąty reprezentujące drzwi i kominy wysokie mają być dwa razy wyższe od kwadratów. Poszczególne elementy powinny być równomiernie rozmieszczone w obrębie kondygnacji, drzwi dotykają do dołu parteru, a kominy wyrastają ponad najwyższym piętrem (patrz rysunek).
Zakładamy, że :kod zawiera co najmniej dwa słowa, a więc dom składa się co najmniej z parteru i dachu.

Poniżej podany jest przykładowy rysunek, jaki może powstać dla wywołania
Dom 90 86 [jan lubi lot].

Zadanie 3.

Zdefiniuj funkcję PUNKTY :lp, której daną jest lista punktów, a wynikiem wartość logiczna prawda lub fałsz. Każdy punkt to dwuelementowa lista złożona z jego x-owej i y-owej współrzędnej. Wynikiem funkcji jest:

  • prawda, gdy na liście znajdują się co najmniej dwa punkty leżące na tej samej prostej równoległej do jednej z krawędzi ekranu (pionowej lub poziomej),
  • fałsz, w przeciwnym przypadku.

Oto przykładowe wyniki:

Wynikiem PUNKTY [[22 33] [33 22] [66 77]] jest fałsz.
Wynikiem PUNKTY [[11 22] [33 44] [11 55]] jest prawda.

Zadanie 4.

Zdefiniuj funkcję SUMACYFR :lp. Dana :lp jest dowolną listą. Wynikiem funkcji jest suma wartości wszystkich cyfr jakie można odczytać w zapisie listy :lp.

Wynikiem SUMACYFR [Ala ma 5 kotów i 12 psów] jest 8 (bo 5+1+2=8).
Wynikiem SUMACYFR [1 [a 5b5 c -23 d8 6e] [[x5]] abc2def] jest 37 (bo 1+5+5+2+3+8+6+5+2=37).