Használható segédanyagok: Haskell könyvtárainak dokumentációja, (lokális!) 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 feladatok egymásra épülnek, ezért érdemes ezeket a megadásuk sorrendjében megoldani, de legalább megérteni az aktuális feladatot megelőző feladatokat! A függvények definíciójában lehet, sőt javasolt is alkalmazni a korábban definiált függvényeket (függetlenül attól, hogy sikerült-e azokat megadni).
Tekintve, hogy a tesztesetek, bár odafigyelés mellett íródnak, nem fedik le minden esetben a függvény teljes működését, határozottan javasolt még külön próbálgatni a megoldásokat beadás előtt, vagy megkérdezni a felügyelőket!
Részpontszámokat csak az elégséges szint elérése után lehet kapni!
Ebben a feladatban egy véges sorozat ún. pasziánsz rendezését kell megvalósítani. Ez a pasziánsz nevű kártyajátékról kapta a nevét, mivel annak menetéhez nagyon hasonlóan végezzük a sorozat rendezését.
A rendezendő sorozatot úgy tekintjük, mint egy véletlenszerűen megkevert kártyapakli egymás után következő lapjait. Ezeket a lapokat (vagyis rendre a sorozat elemeit) ezután halmokba osztjuk szét a következő szabályok szerint:
Kezdetben nincs egyetlen halom sem. Az elsőként kiosztott kártya önmagában fog majd alkotni egy egyetlen kártyából álló halmot.
Minden további kártyát a legbaloldalibb olyan halom tetejére helyezzük, amelynek legfelső kártyájának értéke nagyobb vagy egyenlő az új lap értékével, vagy ennek hiányában az eddigi halmoktól jobbra egy újabb, egyetlen kártyából álló halmot hozunk vele létre.
A játék akkor ér véget, ha elfogytak a kiosztandó kártyák.
Magát a rendezés eredményét ezután pedig úgy kapjuk, ha az iménti szakaszban létrehozott halmokat rendezetten összefésüljük.
A rendezés során alkalmazott halmokat a Pile
(paraméteres) szinonimával ábrázoljuk, amely tulajdonképpen nem lesz más, mint adott típusú elemek listája:
Adjuk meg ezen definíció szerint az üres, vagyis kártyát nem tartalmazó halomnak megfelelő értéket!
Készítsünk egy olyan bináris operátort, amely egy elemet rátesz egy halom tetejére!
Definiáljuk azt a függvény, amely elvégzi az algoritmus első lépését, vagyis a rendezendő sorozat első eleméből képez egy halmot!
Készítsünk egy olyan függvényt, amely adott rendezés szerint megkeresi azt a halmot, amelyre a soronkövetkező elemet kell elhelyezni, majd ráteszi azt!
Ne feledjük, hogy két elem (az első másodikhoz való) viszonyát ebben az esetben egy Ordering
értékkel írjuk le, amely a következő lehet: LT
– kisebb, mint; EQ
– egyenlő; GT
– nagyobb, mint.
Adjuk meg azt a függvényt, amely adott rendezés szerint az algoritmus korábbi fázisában létrehozott halmokat összefésüli egy rendezett sorozattá! A halmok esetében feltételezhetjük, hogy azok már ugyanazon rendezés szerint rendezetten tartalmazzák az elemeket.
Megjegyzés: A megoldásban nem használható semmilyen rendezés!
Írjuk meg a pasziánsz rendezés rendezési relációval paraméterezhető változatát! Ez egy olyan függvény lesz, amely az adott típusbeli két érték viszonyát egy Ordering
típusú értékkel leíró függvény segítségével (ld. fentebb) egy olyan típusú értékeket tartalmazó listából meghatározza annak egy rendezett permutációját!
Megjegyzés: A megoldásban nem használható semmilyen rendezés!
Az egyszerűbb használhatóság érdekében adjuk meg a pasziánsz rendezés azon változatát, amely eleve feltételezi a sorozat elemeinek rendezhetőségét és azok alapértelmezett rendezési relációjával számítja ki annak egy rendezett permutációját!
Megjegyzés: A megoldásban legfeljebb csak a pasziánsz rendezés használható!