Advertisement
Guest User

Ocaml - kody

a guest
Dec 16th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 21.85 KB | None | 0 0
  1. type 'a bin_tree = Node of 'a bin_tree * 'a * 'a bin_tree | Null;;
  2.  
  3. (*
  4.  * napisz procedure path: 'a bin_tree -> 'a list,
  5.  * ktora znajduje najdluzsza sciezka (jedna z)
  6.  * od korzenia do liscia i zwraca liste wartosci
  7.  * znajdujacych sie w wezlach tworzacych te
  8.  * sciezke w kolejnosci od korzenia do liscia
  9.  *)
  10.  
  11. let rec fold_bin_tree f a t =
  12.   match t with
  13.   | Null -> a
  14.   | Node (l,x,r) -> f x (fold_bin_tree f a l) (fold_bin_tree f a r);;
  15.  
  16. let path t =
  17.   let f = (fun w (dl,ll) (dr,lr) ->
  18.     if dl >dr then
  19.       (dl+1, w::ll)
  20.     else
  21.       (dr+1,w::lr))
  22.   in match (fold_bin_tree f (0,[]) t) with | (a,b) -> b;;
  23.  
  24. type 'a bin_tree = Node of 'a bin_tree * 'a * 'a bin_tree | Null;;
  25.  
  26. let rec fold_bin_tree f a t =
  27.   match t with
  28.   | Null -> a
  29.   | Node (l,x,r) -> f x (fold_bin_tree f a l) (fold_bin_tree f a r);;
  30.  
  31. (*
  32.  * napisz procedure ktora dla
  33.  * danego drzewa binarnego obliczy
  34.  * liczbe wierzcholkow nieprzyslonietych
  35.  * przez wyzsze
  36. *)
  37.  
  38. let przys0 d =
  39.   let rec pom d max =
  40.     match d with
  41.     | Null -> 0
  42.     | Node (dl,w,dr) ->
  43.         if w >= max then
  44.           (pom dl w + pom dr w + 1)
  45.         else
  46.           (pom dl max + pom dr max)
  47.   in pom d 0;;
  48.  
  49. let przys d =
  50.   let f = fun w fl fr -> fun max ->
  51.     if w >= max then
  52.       fl w + fr w + 1
  53.     else fl max + fr max
  54.   in (fold_bin_tree f (fun x -> 0) d) 0;;
  55. type 'a tree = Node of 'a tree * 'a * 'a tree | Leaf;;
  56.  
  57. let d = Node(Leaf,7,Node(Node(Leaf,2,Leaf),3,Node(Leaf,2,Leaf)));;
  58.  
  59. (*
  60.  * Napisz funkcję liczącą rozmiar (liczba wierzchołków node) i wysokość drzewa jednocześnie
  61.  *     N
  62.  *  L     N
  63.  *      N   N
  64.  *
  65. *)
  66.  
  67. let max x y = if x > y then x else y;;
  68.  
  69. let rec sh t =
  70.   match t with
  71.    Leaf -> (0, 0) |
  72.    Node( l, _, r ) ->
  73.      let (sl, hl) = sh l
  74.      and (sr, hr) = sh r
  75.      in (sl + sr + 1, 1 + max hr hl);;
  76.  
  77. sh d;;
  78. type 'a tree = Node of 'a tree * 'a * 'a tree | Leaf;;
  79.  
  80. let d = Node(Leaf,7,Node(Node(Leaf,4,Leaf),3,Node(Leaf,2,Leaf)));;
  81.  
  82. (*
  83.  * Napisz funkcję, która obliczy drzewo lustrzande do danego
  84.  *     N
  85.  *  L     N
  86.  *      N   N
  87.  *
  88. *)
  89.  
  90. let rec mirror t =
  91.   match t with
  92.    Leaf -> Leaf |
  93.    Node( l, v, r ) ->
  94.      Node(mirror r, v, mirror l);;
  95.  
  96. mirror d;;
  97. d;;
  98. type 'a tree = Node of 'a tree * 'a * 'a tree | Leaf;;
  99.  
  100. let d = Node(Leaf,7,Node(Node(Leaf,2,Leaf),3,Node(Leaf,2,Leaf)));;
  101.  
  102. (*
  103.  * Drzewo nazywamy ultralewicowym, jeśli głębokości kolejnych liści (Leaf) od lewej do prawej tworzą ciąg nierosnący. Napisz procedurę ultraleft 'a tree -> bool, która sprawdza czy drzewo jest ultralewicowe.
  104.  *     N
  105.  *  L     N
  106.  *      N   N
  107.  *
  108. *)
  109.  
  110. let max x y = if x > y then x else y;;
  111.  
  112. let rec mirror t =
  113.   match t with
  114.    Leaf -> Leaf |
  115.    Node( l, v, r ) ->
  116.      Node(mirror r, v, mirror l);;
  117.  
  118. ;;
  119. let d = Node(Leaf,7,Node(Node(Leaf,2,Leaf),3,Node(Leaf,2,Leaf)));;
  120.  
  121. let ultraleft t =
  122.   let rec help t ok akg osg =
  123.     match t with
  124.       Leaf -> (akg<=osg, akg) |
  125.       Node( l, _, r ) ->
  126.         let (lok, lg) = help l ok (akg+1) osg
  127.         in if not lok then (false, 0)
  128.           else help r (akg+1) lg
  129.   in fst help t 0 max_int;;
  130.  
  131. ultraleft (mirror d);;
  132. ultraleft d;;
  133.  
  134.  
  135. d;;
  136. type 'a tree = Node of 'a tree * 'a * 'a tree | Leaf;;
  137.  
  138. let d = Node(Leaf,7,Node(Node(Leaf,2,Leaf),3,Node(Leaf,2,Leaf)));;
  139.  
  140. (*
  141.  * Napisz procedurę, która dla danego drzewa obliczy
  142.  * listę wartości z wierzchołów Node w obiegu infiksowym
  143.  * od lewej do prawej
  144. *)
  145.  
  146. let infx t =
  147.   let rec pom t li =
  148.     match t with
  149.      Leaf -> li |
  150.      Node( l, v, r ) ->
  151.        pom l (v::(pom r li))
  152.   in pom t [];;
  153.  
  154. infx d;;
  155. type 'a tree = P | W of 'a * 'a tree list;;
  156.  
  157. (*
  158.  * Napisz procedurę głębokość, która dla danego drzewa wyznaczy
  159.  * głębokość (maksymalną odległość korzenia od wierzchołków typu W)
  160. *)
  161.  
  162. let glebokosc t =
  163.   let rec glD t =
  164.     match t with
  165.      | P -> -1
  166.      | W( w,l ) ->
  167.        (glLD l (-1))
  168.   and glLD l wyn =
  169.     match l with
  170.     | [] -> wyn
  171.     | h::t -> (glLD t (max wyn (glD h)))
  172.   in glD t;;
  173. type tree = N of int * tree list;;
  174.  
  175. (*
  176.  * Firma planuje zorganizować przyjęcie.
  177.  * Hierarchia stanowisk ma strukturę drzewa tree.
  178.  * Każdy pracownik charakteryzuje się
  179.  * pewną 'towarzyskością' wyrażoną liczbą dodatnią.
  180.  * Napisz program, który dobierze gości tak, aby na
  181.  * przyjęciu nie był obezni bezpośredni prełożony
  182.  * żadnego z gości i suma współczynników towarzyskości
  183.  * była maksymalna.
  184.  *
  185.  * pr domowa
  186.  *  znalezc liste gosci
  187.  *  jak zagwarantowac ze prezes bedzie na przyjeciu
  188. *)
  189.  
  190. let max x y = if x > y then x else y;;
  191.  
  192. let rec imprezz t =
  193.   let N(w,l) = t
  194.   in let  (slb sl) = imprezLD l 0 0
  195.   in (sl, max sl (slb+w))
  196. and imprezLD l sb s = match l with
  197. [] -> (sb s) |
  198. h::t -> let (shb, sh) = imprezz h
  199. in imprezLD t (sb+shb) (s+sh);;
  200. type tree = Node of tree*tree | Leaf;;
  201.  
  202. (*
  203.  * idk
  204.  *)
  205.  
  206. let listaliczbnode d o =
  207.   let rec spacer d l = match d with
  208.     | Leaf -> l
  209.     | Node(dl,dr) -> let (h,t) = match l with
  210.       | [] -> o,[]
  211.       | h::t -> h,t
  212.     in (h+1)::( spacer dl (spacer dr t))
  213.   in spacer d [];;
  214.  
  215. type 'a bin_tree = Node of 'a bin_tree * 'a * 'a bin_tree | Null;;
  216.  
  217. (*
  218.  * fold bin tree
  219.  *)
  220.  
  221. let rec fold_bin_tree f a t =
  222.   match t with
  223.   | Null -> a
  224.   | Node (l,x,r) -> f x (fold_bin_tree f a l) (fold_bin_tree f a r);;
  225. type 'a bin_tree = Node of 'a bin_tree * 'a * 'a bin_tree | Null;;
  226.  
  227. let rec fold_bin_tree f a t =
  228.   match t with
  229.   | Null -> a
  230.   | Node (l,x,r) -> f x (fold_bin_tree f a l) (fold_bin_tree f a r);;
  231.  
  232. (*
  233.  * napisz procedure ktora dla
  234.  * danego drzewa binarnego obliczy
  235.  * liste wierzcholkow w obiegu
  236.  * infiksowym za pomoca fold_bind_tree
  237. *)
  238.  
  239. (* bez fold *)
  240. let infix0 t =
  241.   let rec spacer d l = match d with
  242.   | Null -> l
  243.   | Node(dl,w,dr) -> spacer dl (w::(spacer dr l))
  244.   in spacer t [];;
  245.  
  246.  
  247. let infix t =
  248.   let f = (fun w fl fr -> fun aku -> fl (w::(fr aku)))
  249.   in (fold_bin_tree f (fun x -> x ) t) [];;
  250. (*
  251.  * Napisz procedurę exists która dla
  252.  * danego predykatu i listy sprawdzi czy
  253.  * na liscie jest element spełniający predykat.
  254. *)
  255.  
  256. let exists li p =
  257.   List.fold_left
  258.     (fun a h ->
  259.       if a = true then
  260.         a
  261.       else
  262.         p h)
  263.     false
  264.     li;;
  265. (*
  266.  * Za pomocą procedury non oraz procedury exists
  267.  * napisz forall, która sprawdza czy dany predykat
  268.  * jest spełniony przez wszystkie elementy listy
  269. *)
  270.  
  271. let non p = fun x -> not (p x);;
  272.  
  273. let exists li p =
  274.   List.fold_left
  275.     (fun a h ->
  276.       if a = true then
  277.         a
  278.       else
  279.         p h)
  280.     false
  281.     li;;
  282.  
  283. let forall li p = not ( exists li (non p) );;
  284. (*
  285.  * Zapisz procedurę append za pomocą fold_left, fold_right
  286. *)
  287.  
  288. let append_r li1 li2 =
  289.   List.fold_right (fun h a -> h::a) li1 li2;;
  290. type 'a tree = Node of 'a * 'a tree list;;
  291.  
  292. (*
  293.  * sprzwdz czy dzrzewo jest zrownowazone
  294.  * ( czy wszystkie liscie sa na tym samym
  295.  *   poziomie)
  296.  *)
  297.  
  298. let zrwn t =
  299.   let f = fun _ l ->
  300.     fold_left ( fun ( ... jpg
  301. let f x = if x mod 3 = 0 then -5 else -x;;
  302. f 1;;
  303. f 2;;
  304. f 3;;
  305. f 4;;
  306.  
  307. let find f n =
  308.   let rec help a b s m d=
  309.     if b = n+1 then
  310.       d
  311.     else if s + (f b) > m then
  312.       help a (b+1) (s+(f b)) (s+(f b)) (b-a+1)
  313.     else if s + (f b) < 0 then
  314.       help (b+1) (b+1) 0 m d
  315.     else
  316.       help a (b+1) (s + (f b)) m d
  317.   in help 1 1 0 (f 1) 1;;
  318.  
  319. find f 4;;
  320.  
  321. let find f n =
  322.   let rec pom a b s smin smax d =
  323.     if b = n + 1 then d
  324.     else if s + (f b) < smin then pom(b+1) (b+1) (s+(f b))  smax d
  325.     else if s + (f b) - smin > smax then pom a (b+1) (s+(f b)) smin (s+(f b)-smin) (b-a+1)
  326.     else pom a (b+1)  (s+ (f b)) smin smax d
  327.   in pom 1 1 0 0 0 0;;
  328.  
  329. find f 4;;
  330. (*
  331.  * Niech f : R -> R będze funkcją
  332.  * bijekcją
  333.  * ciągłą
  334.  * rosnącą i to tak, że V d > 0 : f(x+d) - f(x) >= d
  335.  * f(0) = 0
  336.  * Zaimplementuj procedurę odwrotnść, której wynikiem
  337.  * dla parametru f będzie przybliżone f^-1 z dokładnością
  338.  * zadaną przez stałą epsilon
  339.  * ( czyli jeśli q = odwrotnosc f to V x : | q(x) - f^-1 (x)| <= epsilon )
  340. *)
  341.  
  342. let eps = 0.001;;
  343.  
  344. let odwrotnosc f =
  345.   fun y ->
  346.     let rec szukaj l p = let s = (l+.p) /. 2.
  347.     in if abs_float ( f(s) -. y ) < eps then
  348.       s
  349.     else if f(s) > y then
  350.       szukaj l s
  351.     else
  352.       szukaj s p
  353.     in if (abs_float y) < eps then 0.
  354.     else if y > 0. then szukaj 0. y
  355.     else szukaj y 0.;;
  356.  
  357. module type NOSNIK =
  358.   sig
  359.     type t
  360.   end;;
  361.  
  362. (* op jest łączna *)
  363.  
  364. module type MONOID =
  365.   sig
  366.     type t
  367.     val op : t -> t -> t
  368.     val e : t
  369.   end;;
  370.  
  371. (*
  372.  * Zdefiniuj moduły MonoidLiczbCałkowitych i MonoidFunkcji
  373. *)
  374.  
  375. module MonoidLiczbCalkowitych : MONOID with type t = int =
  376.   struct
  377.     type t = int
  378.     let op = (+)
  379.     let e = 0
  380.   end;;
  381.  
  382. module M = MonoidLiczbCalkowitych;;
  383.  
  384. let tree = M.op M.e 3;;
  385.  
  386. module MonoidFunkcjiCalkowitych : MONOID with type t = int -> int =
  387.   struct
  388.     type t = int -> int
  389.     let op = fun f g -> fun x -> f(g x)
  390.     let e = fun x -> x
  391.   end;;
  392.  
  393. module M = MonoidFunkcjiCalkowitych;;
  394. let tree = M.op M.e (fun x -> 3);;
  395.  
  396. (*
  397.  * Zbuduj monoid składania funkcji - funktor który
  398.  * dla określonego typu t konstruuje to co powyżej
  399. *)
  400.  
  401. module MonoidFunkcji (N: NOSNIK) : MONOID with type t = N.t -> N.t =
  402.   struct
  403.     type t = N.t -> N.t
  404.     let op f g x = f( g x)
  405.     let e = fun x -> x
  406.   end;;
  407.  
  408. module MF = MonoidFunkcji (struct type t = int end);;
  409. let x = MF.op (fun x -> x+1) (fun x -> x+2);;
  410. let xx = MF.op (M.e) (M.e)
  411. let y = x 3;;
  412.  
  413. (*
  414.  * Zdefiniuj funktor, który dla danego
  415.  * monoidu definiuje operację ptęgowania
  416. *)
  417.  
  418. module type MONOID_Z_POTEGOWANIEM =
  419.   sig
  420.     type t
  421.     val op: t -> t -> t
  422.     val e: t
  423.     val pot : int -> t -> t
  424.   end;;
  425.  
  426. module MonoidZPotegowaniemFunktorow(M: MONOID) : MONOID_Z_POTEGOWANIEM with type t = M.t =
  427.   struct
  428.     type t = M.t
  429.     let op = M.op
  430.     let e = M.e
  431.     let rec pot n a =
  432.       if n<=0 then e else op a (pot(n-1) a)
  433.   end;;
  434.  
  435. module Pott = MonoidZPotegowaniemFunktorow( MonoidFunkcji ( struct type t = int end ) );;
  436. let f = Pott.pot 3 ( fun x -> x + 1 );;
  437. let x = f 1;;
  438.  
  439. (*
  440.  * Zdefiniuj funktor, który na podstawie dwóch
  441.  * porządków liniowych tworzy porządek leksykograficzny
  442.  * na parach odpowiedniego typu
  443. *)
  444.  
  445. module type PORZADEK_LINIOWY =
  446.   sig
  447.     type t
  448.     val porownaj : t -> t -> bool
  449.   end;;
  450.  
  451. module PorzadekLiniowyFunktor(A: PORZADEK_LINIOWY) (B: PORZADEK_LINIOWY) : PORZADEK_LINIOWY
  452. with type t = A.t * B.t =
  453.   struct
  454.     type t = A.t * B.t
  455.     let porownaj (a1,b1) (a2,b2) =
  456.       if A.porownaj a1 a2 then
  457.         if A.porownaj a2 a1 then
  458.           B.porownaj b1 b2
  459.         else
  460.           true
  461.       else
  462.         false
  463.   end;;
  464. (*
  465.  * Napisz moduł Counter o następującej sygnaturze
  466. *)
  467.  
  468. module type COUNTER = sig
  469.   type counter
  470.   val make : unit -> counter
  471.   val inc : counter -> int
  472.   val reset : unit -> unit
  473. end;;
  474.  
  475. (*
  476.  * hehe nie dziala
  477. module type MyCOUNTER: COUNTER = struct
  478.   type counter = int ref * int ref
  479.   let make () = (ref 0, ref 0)
  480.   let cnt_reset = ref 0
  481.   let inc c =
  482.     match c with
  483.     (c_val, c_res) ->
  484.       if !c_res = !cnt_reset then
  485.         c_val := !c_val+1; !c_val
  486.       else
  487.         c_val := 1; c_res  := cnt_reset; !c_val
  488.   let reset = cnt_reset := !cnt_reset + 1
  489. end;;
  490. *)
  491.  
  492.  
  493.  
  494. (*
  495.  * Dana jest tablica liczb całkowitych
  496.  * zawierająca permutację liczb od 0 do n
  497.  * ( n >= 0 ). Napisz porcedurę cykl : int array -> int,
  498.  * która wyznaczy długość najdłuższego cyklu
  499.  * danej permutacji. Twoja procedura nie
  500.  * może zmieniać danej tablicy.
  501. *)
  502.  
  503. (*
  504. let cykl t =
  505.   let odw = make (length t) false
  506.   and wyn = ref 0
  507.   in begin
  508.     for j - 0 to (length t) - 1 do
  509.       if not odw.(j) then begin
  510.         odw.(j) <- true;
  511.         let dl = ref 1 and k = ref t.(j)
  512.         in while !k <> j do
  513.           odw.(!k) <- true;
  514.           incr dl;
  515.           k = t.(!k);
  516.         done;
  517.         if !wyn < !dl then
  518.           wyn := !dl;
  519.       end;
  520.       end;
  521.         done;
  522.     !wyn;
  523.   end;;
  524. *)
  525.  
  526. type 'a drzewo =
  527.   Puste | Wezel of 'a * 'a drzewo * 'a drzewo * 'a drzewo ref;;
  528.  
  529. (*
  530.  * Drzewo binarne z fastrygą to drzewo
  531.  * w którym każdy węzeł posiada
  532.  * dodatkowo referencję na następny węzełw
  533.  * porządku infiksowym (ostatni na
  534.  * Pustą). Napsiz procedurę fastryguj
  535.  * : 'a drzewo -> uint która sfastryguje dane drzewo.
  536.  *)
  537.  
  538. zdj
  539. let fastryguj d =
  540.   let rec spacer x s =
  541.     match x with
  542.     | Pus
  543.  
  544.  
  545.  
  546. type 'a tree = Node of 'a * 'a tree list;;
  547.  
  548. let nieparzyste t =
  549.   let rec pomw Node(_,lista) =
  550.     let (rozm,wyn) = poml lista (1,0) in
  551.     if rozm mod 2 = 1 then
  552.       (rozm, wyn+1)
  553.     else
  554.       (rozm,wyn)
  555.     and poml l (roz_a, wyn_a) =
  556.       match l with
  557.       | [] -> (roz_a, wyn_a) =
  558.         match l with
  559.         | [] (roz_a, wyn_a)
  560.         | h::t ->
  561.             let (roz_d, wyn_d) = pomw h
  562.             in poml t (roz_a+roz_d, wyn_a+wyn_d)
  563.   in sec (pomw t);;
  564. (*
  565.  * Napisz program wybierający element dominujący z listy.
  566.  * Uzasadnij jego poprawność.
  567. *)
  568. (*
  569.  * Napisz procedurę budującą listę n pierwszych liczb naturalnych
  570.  *)
  571.  
  572. let rec build n =
  573.   if n = 0 then []
  574.   else n::build (n-1);;
  575.  
  576. (*
  577.  * warunek początkowy: n całkowite n >= 0
  578.  * warunek końcowy: build n = [n;n-1;...1]
  579.  *)
  580.  
  581.  
  582. let rec build_tail n =
  583.   let rec pom i l =
  584.     if i = n+1 then l
  585.     else pom (i+1) (i::l)
  586.   in pom 1 [];;
  587.  
  588.  
  589. build_tail 10;;
  590.  
  591. (*
  592.  * warunek początkowy:
  593.    * 1 <= i <= n+1  i całkowite
  594.    * l - lista liczb całkowitych
  595.  * warunek końcowy:
  596.    * pom i l = [n ... i] @ l
  597.  *
  598.  * warunek początkowy:
  599.    * 1 <= i <= n+1  i całkowite
  600.    * l l = [i-1 ... 1]
  601.  * warunek końcowy:
  602.    * pom i l = [n ... 1]
  603. *)
  604. (*
  605.  * Załóżmy, że dana jest lista [x1, x2, ... xn].
  606.  * Napisz procedurę tails α list -> (α list) list,
  607.  * która dla danej listy twoezt listę jej wszystkich sufiksów,
  608.  * uporządkowanych według ich długości (można wybrać malejąc czy rosnąco)
  609. *)
  610.  
  611. let build_tail l =
  612.   let rec pom l res =
  613.     match l with
  614.     | [] -> []::res
  615.     | h::t -> pom t (l::res)
  616.   in pom l [];;
  617.  
  618. build_tail [1;2;3]
  619.  
  620.  
  621. let rec build l =
  622.   match l with
  623.   | [] -> [[]]
  624.   | h::t -> l::build t;;
  625.  
  626. build [1;2;3]
  627. (*
  628.  * Dane są dwie listy liczb całkowitych uporządkowane niemalejąco.
  629.  * Oblicz ile różnych liczb występuje na tych listach.
  630. *)
  631.  
  632. let min x y = if x < y then x else y;;
  633.  
  634. let uniqe l1 l2 =
  635.   let rec pom l1 l2 wyn ost =
  636.     match l1, l2 with
  637.     | [], [] -> wyn
  638.     | [], h::t ->
  639.         if h <> ost then
  640.           pom [] t (wyn+1) h
  641.         else
  642.           pom [] t wyn h
  643.     | h::t, [] -> pom [] l1 wyn ost
  644.     | h1::t1, h2::t2 ->
  645.         if h1 <= h2 then
  646.           if h1 <> ost then
  647.             pom t1 l2 (wyn+1) h1
  648.           else
  649.             pom t1 l2 wyn h1
  650.         else
  651.           pom l2 l1 wyn ost
  652.   in pom l1 l2 0 0;;
  653.  
  654. uniqe [1;2;4;5] [2;6;8];;
  655. (*
  656.  * Napisz procedurę trójki int list -> (int * int * int) list,
  657.  * która dla zadanej listy liczb dodatnich całkowitych, uporządkowanej
  658.  * rosnąco, stworzy listę takich trójek (a,b,c) liczb z danej listy,
  659.  * że a < b < c  i  c < a + b
  660. *)
  661.  
  662. let three l =
  663.   let rec lo3 l a b =
  664.     match l with
  665.     | [] -> []
  666.     | h::t ->
  667.       if a < b && b < h && h < a + b then
  668.         (a,b,h)::(lo3 t a b)
  669.       else
  670.         lo3 t a b
  671.   and lo2 l a =
  672.     match l with
  673.     | [] -> []
  674.     | h::t -> (lo3 l a h) @ (lo2 t a)
  675.   and lo1 l =
  676.     match l with
  677.     | [] -> []
  678.     | h::t -> (lo2 l h) @ (lo1 t)
  679.   in lo1 l;;
  680.  
  681. three [1;2;3;4];;
  682.  
  683. let three_tail l =
  684.   let rec help a b l res=
  685.     match l with
  686.       [] -> res |
  687.       h::t ->
  688.         if h < a + b then
  689.           help a b t ((a,b,h)::res)
  690.        else
  691.            help a b t res
  692.   in
  693.   let rec help2 a l res =
  694.     match l with
  695.       [] -> res |
  696.       h::t -> help2 a t (help a h t res)
  697.   in
  698.   let rec help3 l res =
  699.     match l with
  700.       [] -> res |
  701.       h::t -> help3 t (help2 h t res)
  702.   in help3 l [];;
  703.  
  704. three_tail [1;2;3;4;5;6;7;8;9;11;111;1123];;
  705.  
  706. (*
  707.  * praca domowa
  708. *)
  709. (*
  710.  * Palindrom to taka lista, że p = rev p.
  711.  * Napisz procedurę palindrom list -> int,
  712.  * która dla danej listy obliczy długość
  713.  * jej najdłuższego spójnego fragmentu,
  714.  * która jest palindromem.
  715. *)
  716. let pow x y =
  717.   let rec help a ac y =
  718.     if y = 0 then
  719.       ac
  720.     else
  721.       if y mod 2 = 1 then
  722.         help (a*a) (ac*a) (y/2)
  723.       else
  724.         help (a*a) (ac) (y/2)
  725.   in help x 1 y;;
  726.  
  727. pow 2 4;;
  728. pow 3 4;;
  729. pow 9 15;;
  730.  
  731. (*
  732.  * Napisz funkcje elementy: 'a list -> int list -> 'a list,
  733.  * która dla list [x1; x2; ... xn] [y1; y2; ... yn ]
  734.  * zwraca listę [x(y1); x(y2); ... x(yn)]
  735. *)
  736. let elementy lx ly =
  737.   let comp (ax,ay) (bx,by) =
  738.     compare ax bx
  739.   in let (y2 = sort comp1 (fold_left fun (la, ind) x -> ((x,ind)::la, ind+1) ([],1) ly)
  740.   in let wybierz lx ind ly2 wyn =
  741.     match ly2 with
  742.     | [] -> wyn
  743.     | (hy,hi)::t ->
  744.         if hy=ind then
  745.           wybierz lx ind t ((hi,hd lx)::wyn)
  746.         else
  747.           wybierz (tl lx) (ind + 1) ly2 wyn
  748.   in let lwyn2 = sort comp (wybierz ly 1 ly2 [])
  749.   in rev(fold_left (fun aku (ax,ay) -> ay::aku) [] lwyn2)
  750. (*
  751.  * Napisz procedurę przedział in list -> int -> int,
  752.  * która dla zadanej listy [x1, ... xn] oraz
  753.  * dla liczby całkowietej r >= 0 obiliczy taką liczbę
  754.  * całkowitą c, że |{ i : |xi -c| <= r}| jest maksymalne
  755. *)
  756.  
  757. let przedzial l r =
  758.   let l = sort compare l
  759.   in let pom c ip lp ik lk max_n max_c =
  760.     match lk with
  761.     | [] -> max_c
  762.     | hk::tk -> match lp
  763.     ...
  764. (*
  765.  * Tokmek ma zapawkę, z której wystają
  766.  * drewniane słupki różnej wysokości.
  767.  * Jednym uderzeniem młotka można wbić
  768.  * lub wysunąć wybrany słupek o 1.
  769.  * Napisz procedure slupki int list -> int,
  770.  * która dla danej listy początkowych wyskosści
  771.  * słupka obliczy minimalną liczbę uderzeń
  772.  * młotka potrzebnych do wyrównania wysokości słupków.
  773. *)
  774.  
  775. let slupki l =
  776.   let mediana l =
  777.     List.nth (List.sort compare l) ((List.length l) / 2) in
  778.   let med = mediana l in
  779.   List.fold_left (fun aku a -> aku + abs(a-med)) 0 l;;
  780. (*
  781.  * Dana jest tablica prostokątna rozmiaru n na m
  782.  * posortowana rosnąco kolumnowo i wierszowo.
  783.  * Sprawdź czy w tablicy jest wartość x.
  784. *)
  785.  
  786. (* nie bedziemy pisac *)
  787.  
  788. (*
  789.  * Dana jest tablica nxn reprezentująca czy
  790.  * osoba x zna osobę y. Sprawdź czy wśród n osób
  791.  * istnieje osobistość = ktość kogo każdy zna i kto
  792.  * i kto nikogo nie zna
  793. *)
  794.  
  795. (* ... *)
  796.  
  797. (*
  798.  * Dany jest graf nieskierowany, którego
  799.  * wierzchołki są ponumerowane od 0 do n-1.
  800.  * Napisz procedurę path : graph -> int,
  801.  * która wyznacza długości ( liczy liczbę krawędzi)
  802.  * najdłuższej ścieżki w tm grafie, na której
  803.  * numery wierzchołków tworzą ciąg rosnący
  804. *)
  805.  
  806. type graph = int list array;;
  807.  
  808. let path G =
  809.   let odl = Array.make (Array.length G) -1 in
  810.   let spacer nr =
  811.     1 + List.fold_left (fun aku w = if w <= nr then aku
  812.     else
  813.       max aku odl.(w)) (-1) G.(nr)
  814.   in let maxi = ref 0
  815.   in for i := n-1 downto 0 do
  816.     maxi := max (!maxi) (odl.(i) <- spacer i; odl.(i))
  817.   done
  818.   !maxi
  819. ;;
  820.  
  821. (*
  822.  * Dana jest prosotkątna mapa górzystego
  823.  * terenu w postaci prostokątnej tablicy
  824.  * dodatnich liczb całkowitych o wymiarach NxM.
  825.  * Chcemy przejść z pola (0,0) do pola do pola
  826.  * (N-1, M-1) ale nie chcemy wspinać się zbyt wysoko.
  827.  * Możemy przesuwać się w kierunkach N, W, S, E.
  828.  * Napisz procedurę wysokość : int array attay -> int
  829.  * która dla danej ampy terenu określi minimalną
  830.  * największą wysokość na którą musi wejść
  831. *)
  832. (*
  833.  * Na szachownicy jest ustalonych n wież,
  834.  * które należy pokolorować. Jeśli dwie
  835.  * wieże się atakuję (są w tej samej kolumnie
  836.  * lub rzędzie) to muszą być tego samego koloru.
  837.  * Napisz procedurę kolory int int * int list -> int,
  838.  * która na podstawie listy współrzędnych wież
  839.  * wyznaczy maksymalną liczbę kolorów, których
  840.  * można użyć kolorując wieże. Pierwszy parametr to
  841.  * rozmiar szachownicy, zakładamy, że współrzędne wież są poprawne.
  842. *)
  843.  
  844. module type FIND_UNION = sig
  845.   type ’a set
  846.   val make_set : ’a ->’a set
  847.   val find : ’a set ->’a
  848.   val equivalent : ’a set ->’a set ->bool
  849.   val union : ’a set ->’a set ->unit
  850.   val elements : ’a set ->’a list
  851.   val n_of_sets : unit->int
  852. end;;
  853.  
  854. (*
  855.  * zakładamy, że istnieje Find_Union_Functor
  856. *)
  857.  
  858. let kolory n l =
  859.   let module FU = Find_Union_Functor (struct end) and
  860.   x = Array.make n None and
  861.   y = Array.make n None and
  862.   pom l =
  863.     match l with
  864.     | [] -> FU.n_of_sets ()
  865.     | (xh,yh)::t -> begin
  866.       let kol = FU.make_set (xh,yh) in
  867.       if x.(xh) = None then
  868.         x.(xh) <- Some kol
  869.       else
  870.         FU.union x.(xh) kol;
  871.       if y.(yh) = None then
  872.         y.(yh) <- Some kol
  873.       else
  874.         FU.union y.(yh) kol;
  875.       pom t
  876.     end
  877.   in pom l;;
  878.  
  879.  
  880. (*
  881.  * Na drzewie wisi n małpek ponumerowanych od 1 do n.
  882.  * Małpka z nr 1 trzyma się gałęzi ogonem. Pozostałe małpki
  883.  * albo są trzymane przez innne, albo trzymają się innych
  884.  * małpek, albo jedno i drugie. Każda małpka ma dwie łapki przednie,
  885.  * każdą może trzymać co najwyżej jedną inną małpkę (za ogon).
  886.  * Rozpoczynając od chwili 0, co sekundę jedna z małpek puszcza
  887.  * jedną łapkę, W ten sposób małpki spadają na ziemię, gdzie
  888.  * dalej mogą puszczać łapki. Czas spadania małpek jest
  889.  * pomijalnie mały. Zaprojektuj algorytm, który na podstawie opisu
  890.  * tego, która małpka trzyma którą, oraz na podstawie opisu
  891.  * łapek puszczanych w kolejbnych chwilach, dla każdej małpki
  892.  * wyznaczy moment kiedy spadnie ona na ziemię.
  893. *)
  894. (*
  895.  * Wygładzenie funkcji z odstępem dx polega na uśrednieniu
  896.  * f(x-dx), f(x) i f(x+dx)
  897.  * Napisz procedurę wygładzającą daną funkcję z zadanym odstępem.
  898.  * Zwróć uwagę na kolejność argumentów.
  899. *)
  900.  
  901. let wygladzenie f dx x = ( f(x -. dx) +. f(x) +. f( x +. dx) ) /. 3.;;
  902. let wygladzenie dx f = fun x -> ( f(x -. dx) +. f(x) +. f( x +. dx) ) /. 3.;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement