- [Prolog] Napište predikát, který naplánuje pokud možno optimální (nutné použít nějakou jednoduchou heuristiku) rozvrh výroby na strojích. Na vstupu je seznam délek operací (např. [3,3,2,6,4]) a maximální čas běhu (např. 10). Operace je možné plánovat na paralelně běžící stroje, chceme, aby celkový počet potřebných strojů byl co nejmenší. Výstupem má být nějaké optimální rozložení operací pro jednotlivé stroje (např. [[3,3,2],[6,4]], což znamená, že použijeme dva stroje, první z nich vykoná operace trvající 3, 3 a 2 úseky, druhý operace trvající 6 a 4 časové úseky, obojí se vejde do limitu 10 časových úseků / stroj).
Náznak možného řešení: Napište si predikát na naplánování co nejvíc operací pro jeden stroj. Rekurzivně plánujte stroje tak dlouho, dokud máte neprázdný seznam úloh. Jako heuristiku šlo použít třeba setřídění.
- [Prolog] Máte zadaný binární strom (klasická t(vlevo, hodnota, vpravo) notace). Roztřiďte vrcholy podle toho, kolikrát musíme jít doprava, než je objevíme. Například pro tento strom je výstupem [[A,B,F],[C,D,G],[E,H,I]].
Náznak možného řešení: Je třeba prostě strom projít a rekurzivně si předávat počet kroků doprava a přitom stavět seznam klasicky appendama.
- [Haskell] Jsou zadány dva typy stromů - jeden, který nemá explicitně rozlišenou levo-pravou orientaci, a druhý, u něhož jsou synové rozlišeni na levé a pravé. Na vstupu dostanete strom, který má v každém vrcholu hodnotu a seznam synů. V každém vrcholu je dvojice (a,Int), kde číslo Int určuje, kolik synů má být vlevo. Úkolem je napsat funkci, která z takového stromu vyrobí strom, který má v každém vrcholu explicitně dva seznamy pro levé a pravé syny.
Náznak možného řešení: Průchod stromem, na generování nového listu použít rekurzi na syny a na levo/pravo použít take, drop.Kód: Vybrat vše
data Tree1 a = Node1 (a,Int) [Tree1 a] data Tree2 a = Node2 [Tree2 a] a [Tree2 a]
- [Haskell] Máte nějakou funkci, která nabývá jen dvou různých funkčních hodnot. Funkce přechází někde (nevíme kde) skokově z jedné funkční hodnoty na druhou. Na vstupu dostanete c a d určující ony dvě funkční hodnoty. Dále dostanete seznam (x,y) bodů, ve kterých jste funkci změřili s nějakou chybou. Napište funkci, která na výstupu tyto body rozdělí na levé a pravé (seznam dvou seznamů) podle toho, které body patří ještě k hodnotě c, a které už k hodnotě d. Pozor, je potřeba minimalizovat celkovou odchylku spočtenou jako součet přes všechny body, kde f(x) je změřená hodnota (ze seznamu) a y skutečná hodnota z našeho odhadu.
Náznak možného řešení: Minimalizaci odchylky šlo řešit prostě průchodem všech možností a vybráním té minimální. Při počítání odchylek zkoušíte posouvat hranici a přitom třídit body.
Ohodnocování vrcholů a hran s minimalizací odchylky, viz http://forum.matfyz.info/viewtopic.php?f=169&t=10536.