Géptermi vizsga

Bevezetés

A négy irányt a síkon a következő karakterekkel reprezentáljuk:

Legyen az út irányok véges listája:

type Path = String

Egy út hossza a benne levő irányok hossza; minden irányba egy egységet haladunk a megfelelő sorrendben. Például a path1 út egy 1 oldalhosszúságú négyzetet ír körül, path3 pedig egy plusz jelet:

path0, path1, path2 :: Path
path0 = "urrd"
path1 = "urdl"
path2 = "uurrddll"
path3 = "ururdrdldlul"

Feladat: Tükrözzünk egy utat!

A tükrözés jelentse azt hogy fordított irányba megyünk rajta végig.

mirror :: Path -> Path

Test>
"ulld" :: Path
Test>
"ruld" :: Path
Test>
True :: Bool

Feladat: Zárt utak

Állapítsuk meg, hogy egy út zárt-e, azaz a végpontja megegyezik a kezdőpontjával!

isClosed :: Path -> Bool

Test>
True :: Bool
Test>
False :: Bool

Feladat: Állítsuk elő egy út pontjainak listáját!

Egy út pontjai azok a pontok amiken az út átmegy. A függvény megkapja azt a pontot amiből elindulunk az úton.

points :: Path -> (Int, Int) -> [(Int, Int)]

Test>
[(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)] :: [(Int, Int)]

Feladat: Számoljuk ki egy zárt út által körülírt területet!

Ha az út az óramutató járásával ellentétes irányban kerüli meg a területet, negatív számot adjunk vissza!

Segítség: A terület kiszámolható a következőképpen: ∑ y(i)*(x(i+1)-x(i)) ahol (x(i),y(i)) i=0,1..n az út pontjai (a kezdőpont az origó). Az összegzésben i 0-tól (n-1)-ig megy.

area :: Path -> Int

Test>
1 :: Int
Test>
4 :: Int
Test>
5 :: Int
Test>
-5 :: Int

Feladat: Pont körüljárása

Döntsük el hogy egy pont benne van-e egy zárt út által körülírt területben! Adjunk vissza 1-et, ha igen, 0-t, ha nem. Ha az út az óramutató járásával ellentétes irányban kerüli meg a pontot, -1-et adjuk vissza. Ha az út többször kerüli meg a pontot, többszörös értéket adjunk vissza! Feltehetjük hogy az út nem megy át a ponton.

isInside :: (Int, Int) -> Path -> Int

Test>
1 :: Int
Test>
0 :: Int
Test>
2 :: Int