Z

A feladat során egy olyan függvényt (z) és a hozzá tartozó segédfüggvényeket kell megvalósítani, amely egy n számot előállít egy – nem feltétlenül szigorúan – növekvő xs sorozat különböző indexű tagjainak az összegeként. Az előállítás fordított sorrendben tartalmazza az eredeti lista egy részlistáját, és előnyben részesíti a nagyobb számokat a felbontásban. Feltételezhetjük, hogy a nagyobb számok előnyben részesítésével visszalépések nélkül lehetséges az előállítás. (Ez az xs sorozat tulajdonsága, a beadandóban csak olyan xs sorozatok szerepelnek, amiknél nem szükséges visszalépés.)

Próbáljuk meg megoldani a feladatot csak a következő segédanyagok felhasználásával: Haskell könyvtárainak dokumentációja, Hoogle, a tárgy honlapja és a BE-AD rendszerbe feltöltött beadandók.

Példák

  1. példa:

    xs = [1,2,4,8,16,…] n = 11

    z(xs,n) = [8,2,1].

  2. példa:

    xs = [1,2,3,4,5,6,…] n = 11

    z(xs,n) = [11].

  3. példa:

    xs = [1,2,3,5,8,13,…] – a Fibonacci-sorozat n = 11

    z(xs,n) = [8,3].

A z függvény

Számok a felbontáshoz

Adjuk meg azt a függvényt, amely egy listában megadott számok közül fordított sorrendben visszaadja az előállítandó számnál kisebb vagy egyenlő számokat! Feltehetjük, hogy az elemeket monoton növekvő sorrendben adtuk meg.


Test>
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1] :: [Integer]

A számlista aktualizálása

Adjuk meg azt a függvényt, amely egy listának visszaadja azon elemeit, amelyek kisebbek vagy egyenlőek a megadott számnál! A lista elemei monoton csökkenő sorozatot alkotnak.


Test>
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1] :: [Integer]

A z függvény felírása

Adjuk meg azt a függvényt, amely egy adott számot előállít egy listában adott számok összegeként! A listából nem minden számot kell feltétlenül felhasználni, de a nagyobb számokat előnyben kell részesíteni a kisebbekkel szemben.

Feltételezhetjük, hogy a lista elemeivel mindig felbontható a paraméterként kapott szám. Feltételezhetjük továbbá, hogy a felbontásban a nagyobb számokat előnyben részesítve mindig megkapható visszalépés nélkül a felbontás.

Segítség: A felbontást próbáljuk meg a listából elsőként azon legnagyobb elemeket kiválasztani, amelyek még kisebbek vagy egyenlőek a megadott számhoz képest, majd innen haladjunk visszafele, de visszalépni már nem kell.


Test>
[11] :: [Integer]
Test>
[8, 2] :: [Integer]
Test>
[9, 1] :: [Integer]

A z függvény tesztelése

Tesztelés Fibonacci-számokkal

Adjuk meg a Fibonacci-sorozatot előállító függvényt!


Test>
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55] :: [Integer]

Adjuk meg a z függvénynek azon változatát, amely Fibonacci-számok segítségével állítja elő a szám felbontását!


Test>
[13, 5, 2] :: [Integer]
Test>
[89, 8, 3] :: [Integer]
Test>
[987, 8, 3, 1] :: [Integer]

Tesztelés kettő hatványaival

Állítsuk elő kettő hatványait egy listában!


Test>
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512] :: [Integer]

Adjuk meg a z függvény azon változatát, amely a kettő hatványainak felhasználásával bontja fel a számot!


Test>
[128, 64, 8] :: [Integer]
Test>
[1024, 512, 256, 128, 64, 16] :: [Integer]
Test>
[1024, 512, 256, 128, 64, 8, 4, 2, 1] :: [Integer]
Test>
[1024, 512, 8, 1] :: [Integer]

Tesztelés tíz hatványaival

Adjuk meg azt a függvényt, amely előállít egy listát, amely tíz minden hatványát kilencszer tartalmazza!


Test>
[1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10, 10, 10, 10, 10, 10, 10, 10] :: [Integer]
Test>
[1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10, 10, 10, 10, 10, 10, 10, 10, 100, 100, 100, 100, 100, 100, 100, 100, 100] :: [Integer]

Adjuk meg a z függvény azon változatát, amely az előbb megadott függvény segítségével a számot tíz hatványainak összegévé bontja fel!


Test>
[1000, 100, 100, 100, 100, 100, 100, 100, 100, 100, 10, 10, 10, 10, 10, 10, 10, 10, 1, 1, 1, 1, 1, 1, 1] :: [Integer]
Test>
[1000, 100, 100, 100, 100, 100, 100, 100, 100, 100, 10, 10, 10, 10, 10, 10, 10, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1] :: [Integer]
Test>
[1000, 1000, 1000, 1000, 100, 100, 100, 100, 10, 10, 10, 10, 1, 1, 1, 1] :: [Integer]

Tesztelés római számokkal

Adott egy konstans, amely tartalmazza a római számjegyek arab szám szerinti megfelelőit. Vegyük észre, hogy ezek segítségével bármilyen 4331-nél kisebb szám felbontható!

Adjuk meg azt a függvényt, amely a fenti lista alapján egy arab számokhoz megadja annak római megfelelőjét, amennyiben ez létezik (benne van a listában)!

A római számjegyekhez a neki megfelelő betűket használjuk: I, V, X, L, C, D, M.

A függvény megadásakor tehát a következő arab számokhoz kell megadni a római megfelelőjét: 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000. Ügyeljünk arra, hogy a függvény parciális, vagyis a többi szám esetén nem ad eredményt! Ezt az error függvény használatával tudjuk jelezni.


Test>
"I" :: String
Test>
"IV" :: String
Test>
"IX" :: String
Test>
"X" :: String
Test>
"L" :: String
Test>
⊥₁ :: String
⊥₁: toRoman: No roman numeral is assigned to the given number.
CallStack (from HasCallStack):
  error, called at ./Z.lhs:224:18 in main:Z

Adjuk meg azt a függvényt, amely a z függvény segítségével egy arab számból előállítja annak római számjegyekre történő felbontását!


Test>
"MCMLVI" :: String
Test>
"MCMXCIX" :: String
Test>
"MCXI" :: String

Tesztelés másodperc alapú rendszerrel

Adjuk meg azt a függvényt, amelyik paraméterül egy számokat tartalmazó listát vár, majd a következőket csinálja:

  1. Előállítja a lista összes kezdőszeletének a produktumát egy listában.

  2. Az eredeti lista segítségével az előállított (produktumokat tartalmazó) lista elemeit duplikálja.

Például:

Tehát a műveletek végeredménye:

[1, 1, 2, 2, 2, 6, 6, 6, 6, 24, 24, 24, 24, 24]

Lássuk a definíciót! (Ha esetleg Int és Integer típusú értékek közti konverzióra lenne közben szükségünk, nyugodtan használhatjuk a fromIntegral függvényt.)


Test>
[1, 1, 2, 2, 2, 6, 6, 6, 6, 24, 24, 24, 24, 24] :: [Integer]
Test>
[1, 1, 1, 1, 1, 5, 5, 10, 10, 10, 10, 10, 50, 50, 100, 100, 100, 100, 100, 500, 500] :: [Integer]

Továbbá készítsünk egy olyan függvényt, amellyel egész számok tízes számrendszerbeli, szöveges reprezentációját tudjuk előállítani!


Test>
"123456789" :: String
Test>
"0" :: String
Test>
"-123456789" :: String

Az alábbi konstans felhasználásával egy másodpercekben megadott időt tudunk hét (w), nap (d), óra (h), perc (m) és másodperc (s) alakban megadni.

Adjuk meg azt a függvényt, amely a time konstans segítségével felbontja a másodpercekben megadott időt és ezt szöveges formában visszaadja!


Test>
"16m40s" :: String
Test>
"16w3d17h46m40s" :: String
Test>
"33w11h33m20s" :: String