Deklaratív programozás nagyzárthelyi, 2003. március 24. ======================================================= SML megoldások, 1.2a változat, dp03s-zh1-mlmegol-v1-2.txt ========================================================= ------------------- A csoport ------------------- 5. Mi a h típusa az alábbi, egymástól független deklarációk kiértékelése után? (a) fun h (x, y) = (y, x) h : 'a * 'b -> 'b * 'a (b) fun h x y = x y y h : ('a -> 'a -> 'b) -> 'a -> 'b (c) fun h x y = (y, y x) h : 'a -> ('a -> 'b) -> ('a -> 'b) * 'b Pontozás (összesen max. 7 pont): 5.a - 5.b Helyes válasz 2 pont. 5.c Helyes válasz 3 pont. 6. Mi a w értéke és típusa az alábbi, egymástól független deklarációk kiértékelése után? (a) val (_::w::_) = [#"w", #"v", #"W", #"9", #":"] w = #"v" : char (b) val ("al", w) = hd(List.filter (fn (x,_) => x="al") [("lo",2),("al",~3),("al",1)]) w = ~3 : int (c) val w = implode(map (fn x => chr(ord x + 1)) (explode "abcd")) w = "bcde" : string Pontozás (összesen max. 7 pont): 6.a - 6.b Helyes válasz 2 pont. 6.c Helyes válasz 3 pont. 7. Az 'a lap adattípust így deklaráljuk: datatype 'a lap = Joker | Piros of 'a (a) Írja fel Joker, Joker : 'a lap Piros és Piros : 'a -> 'a lap Piros "Ász" típusát! Piros "Ász" : string lap Tekintsük az f függvény definícióját: fun f Joker = "" | f (Piros 7) = "99" | f (Piros n) = str(chr n) (b) Mi az x értéke az alábbi, egymástól független deklarációk kiértékelése után? (b1) val x = f Joker x = "" (b2) val x = f (Piros 7) x = "99" (b3) val x = f (Piros(ord #"A")) x = "A" (c) Írjon fejkommentet az f f : int lap -> string függvényhez, azaz speci- f x = üres füzér, ha x=Joker; fikálja a típusát és az "99", ha x=Piros 7; értelmezési tartományát, a c kódú karaktert tartalmazó továbbá írja le deklara- egyelemű füzér, ha x=Piros c tív módon az eredményét! PRE: x = Piros c ==> 0<=ord c<=255 Pontozás (összesen max. 7 pont): 7.a Minden helyes válaszért 1 pont. 7.b1-b3 Minden helyes válaszért 1 pont. 7.c 1 pont. 8. Írjon olyan SML-függvényt csucsok néven, amely egy egész számokat tartalmazó listából (balról jobbra haladva) kigyűjti az összes olyan, egymással szomszédos három számot számhármasok listájaként, amelyekben az első és a harmadik szám kisebb a másodiknál. Segédfüggvényt definiálhat (fejkommenttel!). (* csucsok : int list -> (int * int * int) list csucsok xs = az összes olyan xs-beli, egymással szomszédos három számból álló hármasok listája (balról jobbra haladva xs-ben), amelyekben az első és harmadik szám kisebb a másodiknál *) Példák: csucsok [] = []; csucsok [4,6] = []; csucsok [4,9,6] = [(4,9,6)]; csucsok [4,6,9] = []; csucsok [4,9,~4,0,~2,4,9,2,3,6] = [(4,9,~4),(~4,0,~2),(4,9,2)]; Egy megvalósítása: fun csucsok (x::y::zs) = let (* csk : int * int * int list * (int * int * int) list -> (int * int * int) list csk (x, y, zs, hs) = *) fun csk (x, y, z::zs, hs) = csk(y, z, zs, if x < y andalso y > z then (x,y,z)::hs else hs ) | csk (_, _, [], hs) = rev hs in csk(x, y, zs, []) end | csucsok _ = [] Pontozás (összesen max. 9 pont): Nem követelmény a hatékony program. ------------------- B csoport ------------------- 5. Mi a k típusa az alábbi, egymástól független deklarációk kiértékelése után? (a) fun k (x, y) = x (x y) k : ('a -> 'a) * 'a -> 'a (b) fun k x y = (x, y x) k : 'a -> ('a -> 'b) -> 'a * 'b (c) fun k y x = (x y) y k : 'a -> ('a -> 'a -> 'b) -> 'b Pontozás (összesen max. 7 pont): 5.a - 5.b Helyes válasz 2 pont. 5.c Helyes válasz 3 pont. 6. Mi a w értéke és típusa az alábbi, egymástól független deklarációk kiértékelése után? (a) val [_,_,(w::_)] = [[#"W"], [#"w", #"Z"], [#"v", #"z"]] w = #"v" : char (b) val (w,"ma") = hd(List.filter (fn (_,y) => y="ma") [("jo","fa"),("al","ma"),("el","ma")]) w = "al" : string (c) val w = implode(map (fn x => chr(ord x - 1)) (explode "WXYZ")) w = "VWXY" : string Pontozás (összesen max. 7 pont): 6.a - 6.b Helyes válasz 2 pont. 6.c Helyes válasz 3 pont. 7. Az 'a lap adattípust így deklaráljuk: datatype 'a lap = Pagat | Makk of 'a (a) Írja fel Pagat, Pagat : 'a lap Makk és Makk : 'a -> 'a lap Makk "Filkó" típusát! Makk "Filkó" : string lap Tekintsük az f függvény definícióját: fun f Pagat = "1" | f (Makk 7) = "Németvölgyi út 49." | f (Makk n) = str(chr n) (b) Mi az x értéke az alábbi, egymástól független deklarációk kiértékelése után? (b1) val x = f Pagat x = "1" (b2) val x = f (Makk 7) x = "Németvölgyi út 49." (b3) val x = f (Makk(ord #"A")) x = "A" (c) Írjon fejkommentet az f f : int lap -> string függvényhez, azaz speci- f x = "1", ha x=Pagat; fikálja a típusát és az "Német ... 49.", ha x=Makk 7; értelmezési tartományát, a c kódú karaktert tartalmazó továbbá írja le deklara- egyelemű füzér, ha x=Makk c tív módon az eredményét! PRE: x = Makk c ==> 0<=ord c<=255 Pontozás (összesen max. 7 pont): 7.a Minden helyes válaszért 1 pont. 7.b1-b3 Minden helyes válaszért 1 pont. 7.c 1 pont. 8. Írjon olyan SML-függvényt kutak néven, amely egy egész számokat tartalmazó listából (balról jobbra haladva) kigyűjti az összes olyan, egymással szomszédos három számot számhármasok listájaként, amelyekben az első és a harmadik szám ugyanannyival nagyobb a másodiknál. Segédfüggvényt definiálhat (fejkommenttel!). (* kutak : int list -> (int * int * int) list kutak xs = az összes olyan xs-beli, egymással szomszédos három számból álló hármasoknak a listája, (balról jobbra haladva xs-ben), amelyekben az első és harmadik szám ugyanannyival nagyobb a másodiknál *) Példák: kutak [] = []; kutak [6,4] = []; kutak [6,4,6] = [(6,4,6)]; kutak [6,4,9] = []; kutak [4,2,4,0,4,4,9,~2,9,6] = [(4,2,4),(4,0,4),(9,~2,9)]; Egy megvalósítása: fun kutak (x::y::zs) = let (* ktk : int * int * int list * (int * int * int) list -> (int * int * int) list ktk (x, y, zs, hs) = *) fun ktk (x, y, z::zs, hs) = ktk(y, z, zs, if x > y andalso x-y = z-y then (x,y,z)::hs else hs ) | ktk (_, _, [], hs) = rev hs in ktk(x, y, zs, []) end | kutak _ = [] Pontozás (összesen max. 9 pont): Nem követelmény a hatékony program. Pontszámcsökkentés nélkül elfogadható, ha az x > y feltétel nem szerepel.