Zadania trzeciego etapu Konkursu Informatycznego dla gimnazjalistów LOGIA 10

Zadanie 1 (statki).

W grze w statki, każdy z graczy rysuje na swojej kartce mapę o wielkości 10 na 10 kwadratowych pól. Przed rozpoczęciem gry zaznacza na mapie jeden czteromasztowiec, dwa trójmasztowce, trzy dwumasztowce oraz cztery jednomasztowce. Liczba masztów statku określa, ile sąsiednich pól zajmuje on na mapie. Statki można ustawiać dowolnie, poziomo lub pionowo, nie wolno ich jednak wyginać. Różne statki nie mogą zajmować sąsiednich pól, ani stykać się rogami.

Napisz procedurę STATKI, po wywołaniu której na ekranie zostanie narysowana plansza do gry w statki, o boku długości 400, wraz z losowo (ale poprawnie) rozmieszczonymi statkami, widocznymi jako zamalowane pola.
Poniżej przykładowy efekt wywołania procedury STATKI.

Zadanie 2 (kostka i moneta).

Gra, w którą bawią się dzieci, wymaga użycia jednej sześciennej kości (na jej ścianach jest od 1 do 6 oczek, suma liczby oczek na przeciwległych ścianach wynosi 7) i jednej polskiej monety. Rozpoczyna się od rzutu kością.

Następnie grający rozgrywają kolejne tury gry. Tura polega na tym, że każdy z grających najpierw rzuca monetą, a następnie obraca kość:

  • jeśli wypadł orzeł, to górną ścianą kości staje się ta z bocznych ścian, na której jest najwięcej oczek,
  • jeśli wypadła reszka, to górną ścianą kości staje się ta z bocznych ścian, na której jest najmniej oczek.

Liczba punktów zebranych przez gracza jest sumą liczby oczek widniejących na górnej ścianie kości po obrotach wykonanych przez tego gracza w rozegranych przez niego turach.

Napisz funkcję GRA :kość :moneta :limit, analizującą przeprowadzoną grę.

Parametr :kość to liczba oczek na górnej ścianie kości po jej rzucie na początku gry. Parametr :moneta jest listą składającą się z list będących zapisami kolejnych tur. Zapis jednej tury jest listą składającą się z liter o i/lub r, oznaczających odpowiednio, orła bądź reszkę, wyrzucone monetą przez kolejnych graczy.

Wynikiem funkcji jest lista zawierająca tyle elementów, ilu jest graczy. Każdy kolejny element tej listy jest numerem najwcześniejszej tury, w której liczba punktów zebranych przez kolejnego gracza osiągnęła co najmniej :limit (będący wartością trzeciego parametru funkcji), bądź zero, gdy :limit nie został przez niego osiągnięty do końca gry.

Przykłady:

Wynikiem GRA 3 [[o r][r r][r o]] 7 jest [2 3].
Wynikiem GRA 4 [[o][r][r]] 7 jest [2].
Wynikiem GRA 4 [[o r r][r o r]] 5 jest [1 2 0].

Zadanie 3 (autobusy).

Odległości między sąsiednimi przystankami każdej linii w całej sieci autobusowej, obejmującej nie więcej niż sto przystanków, są identyczne. Napisz funkcję DROGA :linie :p1 :p2. Parametr :linie jest poprawną listą list, z których każda opisuje jedną linię. Opis linii jest listą numerów przystanków, przez które ta linia przebiega, przy czym zakładamy, że linia kursuje dwukierunkowo, tj. od pierwszego przystanku do ostatniego, a następnie od ostatniego do pierwszego. Wynikiem funkcji jest minimalna liczba przystanków (dokładniej: odcinków między przystankami), jaką należy przebyć, aby przejechać z przystanku o numerze :p1 do przystanku o numerze :p2 bez przesiadek, bądź -1, jeśli nie ma bezpośredniego połączenia.

Przykłady:

Wynikiem DROGA [[1 2 3 4 5][6 5 4 9 8 5 2] [1 6 5 8 9]] 1 5 jest 2 (bo pierwszą linią musimy przejechać cztery przystanki, druga nie łączy interesujących nas przystanków, a trzecią musimy przejechać dwa przystanki),
Wynikiem DROGA [[2 4 3 1][4 2 1 3]] 2 1 jest 1 (pierwszą linią trzy przystanki, drugą jeden),
Wynikiem DROGA [[4 3 2 1][3 2]] 2 3 jest 1 (obiema liniami wystarczy przejechać jeden przystanek).

Zadanie 4 (robot).

Robot Gerard potrafi wykonać tylko cztery polecenia, nakazujące mu przejść w jedną z czterech stron świata. Napisz funkcję ROBOT :trasa, której wynikiem jest liczba odcinków, które robot przebył więcej niż raz. Parametr :trasa jest słowem opisującym sekwencję poleceń, w którym mogą występować jedynie litery N, S, W oraz E. Litery te oznaczają odpowiednio polecenie ruchu w kierunku północnym, południowym, zachodnim oraz wschodnim. Gerard może wykonać maksymalnie 500 ruchów.

Przykłady:

Wynikiem ROBOT "NESW jest 0,
Wynikiem ROBOT "NESWNESW jest 4,
Wynikiem ROBOT "NNNESSSSWNNNE jest 2.