Földmérés

Használható segédanyagok: Haskell könyvtárainak dokumentációja, Hoogle, a tárgy honlapja és a BE-AD rendszerbe feltöltött beadandók. Ha bármilyen kérdés, észrevétel felmerül, azt a felügyelőknek kell jelezni, NEM a diáktársaknak!

A feladat összefoglaló leírása

Megmértük a felszín tengerszint feletti magasságát adott távolságonként. Egy mérés eredményét a Measure típussal ábrázoljuk. A szárazföld feletti mérést a Land adatkonstruktor, a tenger feletti mérést pedig a Sea adatkonstruktor ábrázolja.

data Measure
  = Land Int
  | Sea
  deriving (Show,Eq,Data,Typeable)

A szárazföld feletti mérések esetén az Int típusú paraméter a tengerszint feletti magasságot adja meg, amely egy pozitív egész szám. A tenger feletti méréseknél ennek nincs értelme, hiszen ekkor a tengerszint feletti magasság 0.

A méréseket Measure értékek sorozataként adjuk meg egy listában.

type Measures = [Measure]

Segítségképpen adott néhány mérés eredménye:

testMeasures1 :: Measures
testMeasures1 = []
testMeasures2 :: Measures
testMeasures2 =
  [ Land 300, Land 200, Land 400, Sea, Sea, Land 300, Land 200, Land 150, Sea
  , Land 40, Land 80, Land 500, Land 650, Land 890, Land 300, Sea, Sea, Sea
  , Sea, Land 40 ]
testMeasures3 :: Measures
testMeasures3 =
  [ Sea, Sea, Sea, Land 50, Land 100, Land 10, Sea, Land 30, Land 80, Land 350
  , Land 700, Land 980, Land 600, Land 200, Land 40, Sea, Sea, Sea, Sea ]

Szárazföldi mérés (1 pont)

Határozzuk meg, hogy a megadott mérés szárazföldön történt-e!

isLand :: Measure -> Bool

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

Mérés tengeren (1 pont)

Határozzuk meg, hogy mértünk-e tengeren!

hasSea :: Measures -> Bool

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

Szigetek észlelése (2 pont)

Válasszuk szét a tengereket a szigetektől!

splitSegments :: Measures -> [Measures]

Test>
[] :: [Measures]
Test>
[[Land 300, Land 200, Land 400], [Sea, Sea], [Land 300, Land 200, Land 150], [Sea], [Land 40, Land 80, Land 500, Land 650, Land 890, Land 300], [Sea, Sea, Sea, Sea], [Land 40]] :: [Measures]
Test>
[[Sea, Sea, Sea], [Land 50, Land 100, Land 10], [Sea], [Land 30, Land 80, Land 350, Land 700, Land 980, Land 600, Land 200, Land 40], [Sea, Sea, Sea, Sea]] :: [Measures]

Bejárt szigetek száma (2 pont)

Hány szigeten jártunk?

islandCount :: Measures -> Int

Test>
0 :: Int
Test>
4 :: Int
Test>
2 :: Int

Szárazföldi szakaszok hossza (2 pont)

Határozzuk meg a szárazföldi szakaszok hosszát!

lengthOfIslands :: Measures -> [Int]

Test>
[] :: [Int]
Test>
[3, 3, 6, 1] :: [Int]
Test>
[3, 8] :: [Int]

Egyforma szélességű szigetek (3 pont)

Állapítsuk meg, hogy van-e legalább két egyforma szélességű sziget!

hasIslandsOfSameLength :: Measures -> Bool

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

A legmagasabb csúcshoz tartozó sziget (5 pont)

Adjuk meg a sorszáma szerint, hogy hányadik szigeten van a legmagasabb csúcs! Ha egyszer sem mértünk szárazföldön, akkor az értéke legyen Nothing! Megjegyzés: a szigeteket nullától indexeljük, és az első legmagasabbat adjuk vissza, amennyiben több olyan is van.

highestIsland :: Measures -> Maybe Int

Test>
Nothing :: Maybe Int
Test>
Just 2 :: Maybe Int
Test>
Just 1 :: Maybe Int

Derékszögű háromszög átfogójának hossza (1 pont)

Egy derékszögű háromszög két befogójának ismeretében számoljuk a hozzájuk tartozó az átfogó hosszát (kerekítve)!

hypotenuse :: Int -> Int -> Int

Test>
500 :: Int
Test>
501 :: Int
Test>
373 :: Int

Szomszédos mérések közti séta távolsága (2 pont)

Határozzuk meg két szomszédos mérés közötti séta távolságát! A szomszédos mérések légvonalbeli távolságát a függvény paraméterként kapja meg. A távolságot úgy számíthatjuk ki, ha feltételezzük, hogy a mérési pontok között derékszögű háromszögeket állítottunk fel.

walkingDistance :: Int -> Measure -> Measure -> Int

Test>
500 :: Int
Test>
510 :: Int
Test>
751 :: Int

Teljes séta hossza (3 pont)

Határozzuk meg a mérés során megtett séta teljes hosszát! Ebben az esetben ismét megadjuk a mérések közti intervallum hosszát.

fullWalkingDistance :: Int -> Measures -> Int

Test>
0 :: Int
Test>
10398 :: Int
Test>
9561 :: Int

Pontozás

Ponthatárok: