Collatz-sejtés

Általános tudnivalók

Használható segédanyagok: GHC dokumentáció, Hoogle, a tárgy honlapja és a BE-AD rendszerbe feltöltött beadandók. Ha bármi kérdés, észrevétel felmerül, azt a felügyelőnek jelezzétek, NE a mellettetek ülőnek!

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!

Részpontszámokat csak az elégséges szint elérése után lehet kapni!

A feladat összefoglaló leírása

A feladatban a Collatz-sejtéssel fogunk foglalkozni. A sejtés lényege, hogy ha kiválasztunk egy tetszőleges számot és egymás után többször alkalmazzuk rá az f függvényt, akkor előbb-utóbb 1-be jutunk.

Collatze85bcbc0ae23b2df2b8f75aebd11db86.png

A feladat megoldása során pozitív számokkal foglalkozunk!

Az f függvény megadása (1 pont)

Definiáljuk a bevezetésben leírt f függvényt. A fentebb említett definíciótól annyiban tér el, hogy ha 1-et kap paraméterül, akkor eredményül is ezt kell adnia, minden egyéb esetben a fent említett módon viselkedik.

f :: Integer -> Integer

Test>
1 :: Integer
Test>
1 :: Integer
Test>
10 :: Integer

Az f függvény ismétlése (1 pont)

Adjuk meg azt a függvényt, amely egy tetszőleges kezdőpontból végtelenszer alkalmazza az f függvényt!

applyTo :: Integer -> [Integer]

Test>
[1, 1, 1, 1, 1] :: [Integer]
Test>
[100, 50, 25, 76, 38, 19, 58, 29, 88, 44] :: [Integer]
Test>
[1001, 3004, 1502, 751, 2254, 1127, 3382, 1691, 5074, 2537, 7612, 3806, 1903, 5710, 2855, 8566, 4283, 12850, 6425, 19276] :: [Integer]

A lista leghosszabb kezdőszelete (3 pont)

Adjuk meg azt a függvényt, amely megadja a lista leghosszabb olyan kezdőszeletét, amelyben ugyanaz az érték nem szerepel kétszer egymás után!

cutRepeated :: Eq a => [a] -> [a]

Test>
[10, 5, 16, 8, 4, 2, 1] :: [Integer]
Test>
[100, 50, 25, 76, 38, 19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1] :: [Integer]
Test>
[99, 298, 149, 448, 224, 112, 56, 28, 14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1] :: [Integer]

Az f függvény ismétlésének redukálása (1 pont)

Adjuk meg az applyTo függvény azon változatát, amely a sorozat végéről elhagyja az ismétlődő elemeket!

reducedApplyTo :: Integer -> [Integer]

Test>
[50, 25, 76, 38, 19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1] :: [Integer]
Test>
[49, 148, 74, 37, 112, 56, 28, 14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1] :: [Integer]
Test>
[99, 298, 149, 448, 224, 112, 56, 28, 14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1] :: [Integer]

Adott számból induló sorozat hossza (1 pont)

Adjuk meg azt a függvényt, amely megadja egy adott számból indított (redukált) sorozat hosszát!

runSize :: Integer -> Int

Test>
26 :: Int
Test>
26 :: Int

Adott számokból induló sorozatok hosszai (1 pont)

Adjuk meg azt a függvényt, amely az 1-től induló végtelen sorozat minden elemére megadja, hogy milyen hosszú (redukált) sorozat képezhető belőlük az f függvény ismétlésével!

runSizes :: [Int]

Test>
[0, 2, 8, 3, 6, 9, 17, 4, 20, 7] :: [Int]

Elemek elhagyása a sorozatból (3 pont)

Adjuk meg azt a függvényt, amely csak azokat az elemeket hagyja meg a sorozatból, amelyek ,,jobbak’’ valamelyik korábbi eleménél! Egy függvény segítségével tudjuk megadni, hogy mi szerint tekintünk egy elemet jobbnak.

increasingly :: (a -> a -> Bool) -> [a] -> [a]

Test>
[1, 2, 5, 6] :: [Integer]

Egyre ,,jobb’’ elemek sorozata (2 pont)

Adjuk meg azt a függvényt, amely a runSizes sorozatból az egyre jobb elemeket hagyja csak meg!

increasingSizes :: [Int]

Test>
[0, 2, 8, 9, 17, 20, 21, 24, 112, 113] :: [Int]

Növekvő sorozatok (4 pont)

Adjuk meg azt a függvényt, amely előállítja azon számoknak a sorozatát, amelyek az őt megelőző minden számnál hosszabb sorozatot generál!

increasingNumbersByRun :: [Integer]

Test>
[1, 2, 3, 6, 7, 9, 18, 25, 27, 54] :: [Integer]

Pontozás