Pandigitális számok

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!

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!

A feladat összefoglaló leírása

A matematikában pandigitális számoknak nevezzük azokat az egészeket, amelyek számjegyei között megtalálható az adott számrendszer minden számjegye legalább egyszer. Ilyen tulajdonságokat teljesítő számokkal, illetve a hozzájuk kapcsolódó függvényekkel fogunk a feladat során foglalkozni.

Számjegyekre bontás (1 pont)

Adjuk meg azt a függvényt, amely egy adott nemnegatív egész számot felbont számjegyeire adott számrendszerben (Base)! Az egyszerűség kedvéért a kisebb helyiérték legyen a listában előbb!

type Base = Int
toDigits :: Base -> Integer -> [Int]

Test>
[0, 0, 1, 0, 0, 1, 1] :: [Int]
Test>
[3, 7, 1] :: [Int]
Test>
[1, 6, 3, 7, 2] :: [Int]

Egyedi elemek rendezetten (1 pont)

Adjuk meg azt a műveletet, amely a lista rendezése mellett megszűnteti a listában található elemek ismétlődéseit!

uniqueSort :: (Ord a) => [a] -> [a]

Test>
[1, 2, 3, 4, 5] :: [Integer]
Test>
[] :: [()]
Test>
"aflm" :: [Char]

Pandigitális szám-e? (1 pont)

Adjuk meg azt a függvényt, amely eldönti, hogy az adott nemnegatív egész szám pandigitális-e az adott számrendszerben!

isPandigital :: Base -> Integer -> Bool

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

Számok szöveges reprezentációja (1 pont)

Készítsünk egy olyan függvényt, amely előállítja az adott nemnegatív egész számhoz annak adott számrendszerbeli szöveges ábrázolását!

toString :: Base -> Integer -> String

Test>
"11111111" :: String
Test>
"1100100" :: String
Test>
"1023" :: String
Test>
"157" :: String
Test>
"1023456789abcdef" :: String

Pandigitális számok megadása (1 pont)

Adjuk meg azt a függvényt, amely felsorolja szöveges formában 1-től (tízes számrendszerben) megadott n-ig azokat a számokat, amelyeket a paraméterként megadott számrendszerben pandigitálisnak tekintünk!

pandigitalsUpToN :: Base -> Integer -> [String]

Test>
["10", "100", "101", "110", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "10000"] :: [String]
Test>
["102", "120", "201", "210", "1002", "1012", "1020", "1021", "1022", "1102", "1120", "1200", "1201", "1202", "1210"] :: [String]
Test>
["1023", "1032", "1203", "1230", "1302", "1320", "2013", "2031", "2103", "2130", "2301", "2310", "3012"] :: [String]

Pandigitális római számok

Terjesszük a pandigitális tulajdonság vizsgálatát római számokra! A római számokat így ábrázoljuk:

data RomanNumeral = I | V | X | L | C | D | M
  deriving (Show, Eq, Ord, Data, Typeable)

type RomanNumber = [RomanNumeral]

Kompakt alak előállítása (1 pont)

Római számoknak van úgynevezett kompakt és egyszerű alakjuk. A kompakt alaknál például a 4 számot [I,I,I,I] helyett így írjuk: [I,V]. A további szabályokat az alábbi táblázat tartalmazza:

Kompakt alak Egyszerű alak
IV IIII
IX VIIII
XL XXXX
XC LXXXX
CD CCCC
CM DCCCC

Készítsünk egy függvényt, amely egy római számot kompakt alakra hoz!


Test>
[I, V, I, V, I, V, I, V] :: [RomanNumeral]
Test>
[X, L, V, V, V, I, X] :: [RomanNumeral]
Test>
[C, M, C, X, C] :: [RomanNumeral]

Egész szám konvertálása rómaivá (2 pont)

Készítsünk egy függvényt, amely pozitív egész számokat kompakt alakú rómaivá tud alakítani!


Test>
[I, I, I] :: [RomanNumeral]
Test>
[L, X, X, V, I, I] :: [RomanNumeral]
Test>
[M, C, M, L, X, I, X] :: [RomanNumeral]
Test>
[M, M, M, M, X, C, V, I] :: [RomanNumeral]

Pandigitális római szám-e? (1 pont)

Adjuk meg azt a függvényt, amely eldönti, hogy az adott pozitív egész szám kompakt római szám alakjában pandigitális-e!


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

Pontozás (elmélet + gyakorlat)