od jankasvk » 17. 9. 2016 16:30
Pridávam svoje riešenia k malým úlohám.
Môže sa vyskytnúť neporozumenie úlohy, či nesprávne riešenie. Snáď ale niekomu môžu pomôcť keď si nebude vedieť dať rady.
Kód: Vybrat vše
planuj(Max, Oper, Rozvrh) :-
sort(Oper, ZorOper),
reverse(ZorOper, RZ),
rozdel2(Max, RZ, Rozvrh).
rozdel2(_, [], []) :- !.
rozdel2(Max, Zs, [X|Xs]) :-
%prideluj ulohy kym stroj vladze
rozdel(Max, Zs, [], X, Zvysok),
%pridel zvysne ulohy
rozdel2(Max, Zvysok, Xs).
% kolko este mozem vtesnat --- odkroji z listu tolko co sa zmesti do max
rozdel(_, [], Vys, Vys, []).
rozdel(Left, [X|Xs], Vys, Vys, [X|Xs]) :-
X > Left.
rozdel(Left, [X|Xs], Ys, Vys, Zv) :-
X =< Left,
NewL is Left - X,
rozdel(NewL, Xs, [X|Ys], Vys, Zv).
Kód: Vybrat vše
vpravo(nil, _, []).
vpravo(t(L, A, P), Hlbka, [Hlbka-A|NewList]) :-
succ(Hlbka, NewH),
vpravo(P, NewH, L1),
vpravo(L, Hlbka, L2),
append(L1, L2, NewList).
vyries(Strom, Vysledok) :-
vpravo(Strom, 0, Vys),
sort(Vys, Vys2),
zg(Vys2, Vysledok).
% urcenie spravneho poctu mnoziniek a ich vytvorenie
zg(Z, New) :-
last(Z, N-X),
zg2(Z, 0, [], New),
succ(N, N1),
length(New, N1).
% spajanie vrcholov do mnozin
zg2([], N, Old, New) :-
nth0(N, New, Old).
zg2([N-X|Xs], N, Old, New) :-
zg2(Xs, N, [X|Old], New).
zg2([N-X|Xs], M, Old, New) :-
N \= M,
nth0(M, New, Old),
zg2(Xs, N, [X], New).
Kód: Vybrat vše
data Tree1 a = Node1 (a, Int) [Tree1 a]
data Tree2 a = Node2 [Tree2 a] a [Tree2 a]
deriving Show
vyvaz :: Tree1 a -> Tree2 a
vyvaz (Node1 (hod, 0) []) = Node2 [] hod []
vyvaz (Node1 (hod, poc) xs) =
Node2 (map (vyvaz) (take poc xs)) hod (map (vyvaz) (drop poc xs))
Kód: Vybrat vše
vyries :: Float -> Float -> [(Float, Float)] -> ([Float], [Float])
vyries c d merania = rozdel merania (skok c d merania)
skok :: Float -> Float -> [(Float, Float)] -> Float
skok c d merania = snd $ minimum [ (odchylka merania x c d, x) | (x, y) <- merania]
rozdel :: [(Float, Float)] -> Float -> ([Float], [Float])
rozdel merania bod = (map fst $ takeWhile (\(x, y) -> x < bod) merania, map fst $ dropWhile (\(x,y) -> x < bod) merania)
odchylka :: [(Float, Float)] -> Float -> Float -> Float -> Float
odchylka [] _ _ _ = 0
odchylka ((x,y):xs) bod c d
| x < bod = (y - c)^2 + zvysnaOdchylka
| otherwise = (y - d)^2 + zvysnaOdchylka
where zvysnaOdchylka = odchylka xs bod c d
Pridávam svoje riešenia k malým úlohám.
[i]Môže sa vyskytnúť neporozumenie úlohy, či nesprávne riešenie. Snáď ale niekomu môžu pomôcť keď si nebude vedieť dať rady.[/i]
[code]
planuj(Max, Oper, Rozvrh) :-
sort(Oper, ZorOper),
reverse(ZorOper, RZ),
rozdel2(Max, RZ, Rozvrh).
rozdel2(_, [], []) :- !.
rozdel2(Max, Zs, [X|Xs]) :-
%prideluj ulohy kym stroj vladze
rozdel(Max, Zs, [], X, Zvysok),
%pridel zvysne ulohy
rozdel2(Max, Zvysok, Xs).
% kolko este mozem vtesnat --- odkroji z listu tolko co sa zmesti do max
rozdel(_, [], Vys, Vys, []).
rozdel(Left, [X|Xs], Vys, Vys, [X|Xs]) :-
X > Left.
rozdel(Left, [X|Xs], Ys, Vys, Zv) :-
X =< Left,
NewL is Left - X,
rozdel(NewL, Xs, [X|Ys], Vys, Zv).
[/code]
[code]
vpravo(nil, _, []).
vpravo(t(L, A, P), Hlbka, [Hlbka-A|NewList]) :-
succ(Hlbka, NewH),
vpravo(P, NewH, L1),
vpravo(L, Hlbka, L2),
append(L1, L2, NewList).
vyries(Strom, Vysledok) :-
vpravo(Strom, 0, Vys),
sort(Vys, Vys2),
zg(Vys2, Vysledok).
% urcenie spravneho poctu mnoziniek a ich vytvorenie
zg(Z, New) :-
last(Z, N-X),
zg2(Z, 0, [], New),
succ(N, N1),
length(New, N1).
% spajanie vrcholov do mnozin
zg2([], N, Old, New) :-
nth0(N, New, Old).
zg2([N-X|Xs], N, Old, New) :-
zg2(Xs, N, [X|Old], New).
zg2([N-X|Xs], M, Old, New) :-
N \= M,
nth0(M, New, Old),
zg2(Xs, N, [X], New).
[/code]
[code]
data Tree1 a = Node1 (a, Int) [Tree1 a]
data Tree2 a = Node2 [Tree2 a] a [Tree2 a]
deriving Show
vyvaz :: Tree1 a -> Tree2 a
vyvaz (Node1 (hod, 0) []) = Node2 [] hod []
vyvaz (Node1 (hod, poc) xs) =
Node2 (map (vyvaz) (take poc xs)) hod (map (vyvaz) (drop poc xs))
[/code]
[code]
vyries :: Float -> Float -> [(Float, Float)] -> ([Float], [Float])
vyries c d merania = rozdel merania (skok c d merania)
skok :: Float -> Float -> [(Float, Float)] -> Float
skok c d merania = snd $ minimum [ (odchylka merania x c d, x) | (x, y) <- merania]
rozdel :: [(Float, Float)] -> Float -> ([Float], [Float])
rozdel merania bod = (map fst $ takeWhile (\(x, y) -> x < bod) merania, map fst $ dropWhile (\(x,y) -> x < bod) merania)
odchylka :: [(Float, Float)] -> Float -> Float -> Float -> Float
odchylka [] _ _ _ = 0
odchylka ((x,y):xs) bod c d
| x < bod = (y - c)^2 + zvysnaOdchylka
| otherwise = (y - d)^2 + zvysnaOdchylka
where zvysnaOdchylka = odchylka xs bod c d
[/code]