Falfesté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

Ebben a feladatban egy n x n mezőből álló fal kifestésének tervezését segítő függvényeket kell magvalósítani. A feladatok egy része egymásra épül, ezeket megadás sorrendjében kell megoldani, de a többi esetben ez nem kötelező!

Egy olyan négyzet alakú falat szeretnék kifesteni, amelyet n x n kisebb négyzetre (mezőre) bontunk. A fal mintájának tervezése során minden mezőhöz színkódot rendelhetünk. Összesen tízféle színt tudunk használni, a színeket a 0 és 9 közötti egész számok reprezentálják.

Egy n x n-es fal festési tervét egy olyan lista reprezentálja, amely a sorok színkódjait tartalmazza egy-egy allistában. Azoknál a feladatoknál, amelyek ezt külön nem kérik, a színkódokat nem kell ellenőrizni (tehát, hogy valóban 0 és 9 közé esnek-e)!

Például:

testWall :: [[Int]]
testWall =
    [[0,0,0]
    ,[5,5,5]
    ,[1,2,1]
    ]

Ennek a 3 x 3 mezőre bontott falnak az első sora 0-ás színű, a második sora 5-ös színű, a 3. sor 1. és 3. mezője 1-es, míg a 2. mezője 2-es színű.

Egyszínű fal létrehozása (1 pont)

Adjunk meg egy olyan függvényt, amely létrehoz egy adott színre festett, n x n-es falat!

monochromeWall :: Int{-szín-} -> Int{-n-} -> [[Int]]

Test>
[[0, 0], [0, 0]] :: [[Int]]
Test>
[[6, 6, 6, 6, 6], [6, 6, 6, 6, 6], [6, 6, 6, 6, 6], [6, 6, 6, 6, 6], [6, 6, 6, 6, 6]] :: [[Int]]
Test>
[[8]] :: [[Int]]

Minden szín invertálása egy sorban (1 pont)

Egy szín inverze az a szín, amelynek színkódjával együtt 9-et adnak ki. Például a 0-ás szín inverze a 9-es, a 7-esé a 2-es, stb. Adjunk meg egy olyan függvényt, amely a paraméterként kapott sorban a színeket az inverzükre cseréli!

invertARow :: [Int] -> [Int]

Test>
[8, 7, 8] :: [Int]
Test>
[9, 9, 9] :: [Int]
Test>
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0] :: [Int]

Minden szín invertálása az egész falon (1 pont)

Adjunk meg egy olyan függvényt, amely a paraméterül kapott falon az összes színt az inverzére cseréli!

invert :: [[Int]] -> [[Int]]

Test>
[[9, 9, 9], [4, 4, 4], [8, 7, 8]] :: [[Int]]
Test>
[[9, 8], [7, 6]] :: [[Int]]
Test>
[[5]] :: [[Int]]

Hibás színkódok száma (2 pont)

A 0 és 9 között színkódok szabályosak, minden ettől eltérő színkódot hibásnak tekintünk. Adjunk meg egy olyan függvényt, amely megadja, hogy a paraméterként kapott falon hány hibás színkód van!

numberOfInvalidColours :: [[Int]] -> Int

Test>
0 :: Int
Test>
81 :: Int
Test>
2 :: Int

Hibás színkódok kicserélése a 0 színre (2 pont)

Adjunk meg egy olyan függvényt, amely a hibás színkódokat a 0 színkódra cseréli az adott falon!

changeInvalidColours :: [[Int]] -> [[Int]]

Test>
[[0, 0, 0], [5, 5, 5], [1, 2, 1]] :: [[Int]]
Test>
[[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]] :: [[Int]]
Test>
[[9, 0], [0, 9]] :: [[Int]]

Fal mintával (3 pont)

Adott a háttérszín, a minta színe, és a fal mérete (hány mező van egy sorban) ilyen sorrendben. Adjunk meg egy olyan függvényt, amely egy olyan falmintát állít elő, ahol a fal átlói mentén lévő mezők a mintaszínnel egyeznek meg, a többi mező pedig háttérszínű.

Segítség: ha a mezőket egy sorban 1-től n-ig és a sorokat is 1-től n-ig sorszámozzuk, akkor lesz egy mező valamelyik átló mentén, ha a sor- és oszlopszám megegyezik, vagy ha a sor és oszlopszám összege n + 1.

xPatternedWall :: Int{-háttér-} -> Int{-előtér-} -> Int{-n-} -> [[Int]]

Test>
[[5]] :: [[Int]]
Test>
[[7, 6, 7], [6, 7, 6], [7, 6, 7]] :: [[Int]]
Test>
[[8, 0, 0, 8], [0, 8, 8, 0], [0, 8, 8, 0], [8, 0, 0, 8]] :: [[Int]]
Test>
[[8, 0, 0, 0, 8], [0, 8, 0, 8, 0], [0, 0, 8, 0, 0], [0, 8, 0, 8, 0], [8, 0, 0, 0, 8]] :: [[Int]]

Két falminta kombinálása (4 pont)

Adott egy függvény, amely megadja, hogy két szín összekeveréséből hogyan áll elő egy harmadik szín, és adott két falminta. Az eredményként előálló fal mérete a kisebbik falminta méretével egyezik meg, egy mezőjének színe pedig a paraméterként kapott két falminta ugyanazon koordinátáin található mezők színeinek keverésével számolandó ki.

Példa a színkeverésre:

mixColours x y = (x + y) `mod` 10
mixWallPatterns :: (Int -> Int -> Int) -> [[Int]] -> [[Int]] -> [[Int]]

Test>
[[0, 0, 0], [0, 0, 0], [2, 4, 2]] :: [[Int]]
Test>
[[1, 2], [5, 6]] :: [[Int]]
Test>
[[1, 5], [5, 1]] :: [[Int]]

Színszámlálás (4 pont)

Adott egy falfestési terv, és ki szeretnék deríteni, hogy melyik festékből mennyire lesz szükségünk. Ehhez először a hibás színkódokat alakítsuk át 0 színkóddá, majd számoljuk meg, melyik színhez mennyi mező tartozik a falon! Az eredményként kapott listában rendezett párokban szerepeljenek a színek és az adott színű mezők száma a színkódok szerinti növekvő sorrendben. Csak azokat a színeket szerepeltessük, amely színhez legalább egy mező tartozik a falon!

colorStatistics :: [[Int]] -> [(Int,Int)]

Test>
[(1, 3), (2, 3), (3, 3), (4, 3), (9, 5)] :: [(Int, Int)]
Test>
[(0, 3), (1, 2), (2, 1), (5, 3)] :: [(Int, Int)]
Test>
[(5, 16)] :: [(Int, Int)]
Test>
[(0, 16)] :: [(Int, Int)]
Test>
[(0, 16), (8, 9)] :: [(Int, Int)]
Test>
[(0, 16), (8, 9)] :: [(Int, Int)]

Pontozás