Zadanie 1

Získať môžete max. 5 bodov za každú z úloh (spolu max. 10 bodov). Zadanie musí byť vypracované v Git repozitári, ktorý bol pre vás vytvorený.

Formula 1

Úloha 0.1

Definujte funkciu f1Results pre výpočet výsledkov seriálu pretekov Formuly 1. Parametrom funkcie je zoznam, ktorého prvkami sú zoznamy zodpovedajúce výsledkom jednotlivých veľkých cien. Každý takýto zoznam obsahuje mená pretekárov zoradené podľa umiestnenia v danej veľkej ceny (víťaz je prvý). Výsledkom funkcie má byť zoznam mien pretekárov a ich bodov zoradený podľa počtu bodov v celkovom hodnotení.

f1Results :: [[String]] -> [(String, Int)]

Funkcia musí byť definovaná v súbore Formula1.hs, ktorý bude mať hlavičku

module Formula1 where

Body sa za každú veľkú cenu prideľujú podľa zoznamu pointsScoring (teda, za 1. miesto 25 bodov, za 2. miesto 18 bodov, atď.).

pointsScoring :: [Int]
pointsScoring = [25, 18, 15, 12, 10, 8, 6, 4, 2, 1]

Pretekárov na veľkej cene môže byť aj viac ako 10 (alebo aj menej) a nie všetci sa musia zúčastniť každej veľkej ceny.

Segmentový displej

Úloha 0.2

Definujte funkciu sevenSegmentDisplay pre zobrazenie čísla (aj viacciferného) pomocou sedemsegmentových displejov. Každá cifra vo vstupnom čísle bude zobrazená jednou sedemsegmentovkou.

Prvým parametrom funkcie nech je šírka sedem segmentovky, druhým – číslo, ktoré je potrebné zobraziť.

sevenSegmentDisplay :: Int -> Int -> String

Funkcia musí byť definovaná v súbore SegmentDisplay.hs, ktorý bude mať hlavičku

module SegmentDisplay where

Jednou sedemsegmentovkou nech je možné zobraziť 10 obrazcov. Každý obrazec nech je reprezentovaný jednocifernou číslicou. Predpokladom je, že každý obrazec zodpovedá tvaru číslice, ktorá ho reprezentuje.

Konfigurovateľnosť obrazcov nech je jednoduchá. Každý obrazec nech je reprezentovaný zoznamom celých čísel, kde tieto číslice indexujú jednotlivé segmenty sedem segmentovky. Napríklad, ak sa budú indexovať segmenty zhora dole a zľava doprava, potom obrazce čísel môžu byť definované nasledovne:

numbers :: [[Int]]
numbers = [[1,2,3,5,6,7], [3,6], [1,3,4,5,7], [1,3,4,6,7], [2,3,4,6],
           [1,2,4,6,7], [2,4,5,6,7], [1,3,6], [1,2,3,4,5,6,7], [1,2,3,4,6]]

Na výpis do terminálu môžete použiť pomocnú funkciu printNumber:

printNumber :: Int -> Int -> IO ()
printNumber size num = putStr (sevenSegmentDisplay size num)

Napríklad, pri aplikácii printNumber 7 1234567890 nech je výstup v tvare:

         *****   *****           *****           *****   *****   *****   *****
      *       *       * *     * *       *             * *     * *     * *     *
      *       *       * *     * *       *             * *     * *     * *     *
      *       *       * *     * *       *             * *     * *     * *     *
      *       *       * *     * *       *             * *     * *     * *     *
      *       *       * *     * *       *             * *     * *     * *     *
         *****   *****   *****   *****   *****           *****   *****
      * *             *       *       * *     *       * *     *       * *     *
      * *             *       *       * *     *       * *     *       * *     *
      * *             *       *       * *     *       * *     *       * *     *
      * *             *       *       * *     *       * *     *       * *     *
      * *             *       *       * *     *       * *     *       * *     *
         *****   *****           *****   *****           *****           *****

Poznámka

Pre prevod znaku na číslo môžete použiť funkciu digitToInt z knižnice Data.Char. Knižnicu musíte pripojiť pomocou deklarácie

import Data.Char