Advertisement
PearlyXD

imperatywne

Jan 9th, 2021 (edited)
3,588
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 3.33 KB | None | 0 0
  1. open Array;;
  2. (*Zadanie 2*)
  3. let cykl tab =
  4.   let n = length tab in
  5.   let odw = make n 0
  6.   and akt = ref 0
  7.   and best = ref 0 in begin
  8.   for i = 0 to (n - 1) do
  9.     akt := 0;
  10.     let j = ref i in
  11.     while odw.(!j) = 0 do
  12.       odw.(!j) <- 1;
  13.       akt := !akt + 1;
  14.       if !akt > !best then best := !akt;
  15.       j := tab.(!j)
  16.     done
  17.   done; !best end
  18. ;;
  19.  
  20. (*Zadanie 4*)
  21. let nawiasy tab =
  22.   let n = length tab
  23.   and p = ref 0
  24.   and k = ref 0
  25.   and cnt = ref 0
  26.   and best = ref 0 in
  27.   begin
  28.     while !k < n do
  29.       if tab.(!k) = '(' then
  30.         begin
  31.           cnt := !cnt + 1;
  32.           k := !k + 1;
  33.         end
  34.       else
  35.         begin
  36.           cnt := !cnt - 1;
  37.           k := !k + 1;
  38.           if !cnt < 0 then
  39.             begin
  40.               cnt := 0;
  41.               p := !k;
  42.             end
  43.           else
  44.             begin
  45.               if !k - !p - !cnt > !best then
  46.                 begin
  47.                   best := !k - !p - !cnt
  48.                 end
  49.             end
  50.         end
  51.     done;
  52.     !best
  53.   end
  54. ;;
  55.  
  56. let test1 = [|'(';'(';'(';')'|];;
  57. let test2 = [|')';')';')'|];;
  58. let test3 = [|'(';'(';')';')'|];;
  59. let test4 = [|'(';'(';'(';')';')';')';')';'(';'(';'(';')'|];;
  60.  
  61. type 'a tree =
  62.   Node of 'a * 'a * 'a tree * 'a tree ref |
  63.   Null
  64. ;;
  65.  
  66. (*Zadanie 6*)
  67. let diag a b = Float.sqrt (a *. a +. b *. b);;
  68.  
  69. (*czas: log(n)*)
  70. let diagonal a b =
  71.   let n = length a in
  72.   let l = ref 0
  73.   and r = ref n
  74.   and m = ref 0
  75.   and w = ref 0. in
  76.   begin
  77.     while !l < !r do
  78.       m := (!l + !r)/2;
  79.       if (a.(!m) -. b.(!m)) < 0. then begin l := !m + 1 end
  80.       else begin r := !m end
  81.     done;
  82.     if !l > 0 then begin
  83.       w := (min (diag a.(!l) b.(!l)) (diag a.(!l - 1) b.(!l - 1)));
  84.     end
  85.     else begin w := (diag a.(!l) b.(!l)) end;
  86.     !w
  87.   end
  88. ;;
  89.  
  90. let test1a = [|1.;2.;4.;5.;20.;25.;50.;|];;
  91. let test1b = [|100.;50.;25.;20.;5.;4.;2.;|];;
  92.  
  93. (*Zadanie 10*)
  94. (*złożoność czasowa O(n), złożoność pamięciowa O(1)*)
  95. let rotacja tab k =
  96.   let temp = ref '1'
  97.   and n = length tab in
  98.   let k = k mod (n - 1)
  99.   and reverse a b =
  100.     begin
  101.       for i = 0 to (b - a)/2 do
  102.         temp := tab.(a + i);
  103.         tab.(a + i) <- tab.(b - i);
  104.         tab.(b - i) <- !temp
  105.       done
  106.     end in
  107.   begin
  108.     reverse 0 (n - k - 1);
  109.     reverse (n - k) (n - 1);
  110.     reverse 0 (n - 1)
  111.   end
  112. ;;
  113.  
  114. let testchar = [|'a'; 'l'; 'a'; 'm'; 'a'; 'k'; 'o'; 't';  'a'|];;
  115.  
  116. (*Zadanie 13*)
  117. let blisko_zera tab =
  118.   let n = length tab
  119.   and l = ref 0
  120.   and r = ref 0
  121.   and m = ref 0
  122.   and w = ref 0 in
  123.   begin
  124.     if (tab.(0) < tab.(n - 1)) then begin
  125.       l := 0;
  126.       r := n;
  127.       while !l < !r do
  128.         m := (!l + !r)/2;
  129.         if tab.(!m) < 0 then begin
  130.           l := !m + 1
  131.         end else begin
  132.           r := !m
  133.         end
  134.       done;
  135.       if !l > 0 then begin
  136.         w := min (abs tab.(!l)) (abs tab.(!l - 1))
  137.       end else begin
  138.         w := abs tab.(!l)
  139.       end
  140.     end else begin
  141.       l := 0;
  142.       r := n;
  143.       while !l < !r do
  144.         m := (!l + !r)/2;
  145.         if tab.(!m) <= 0 then begin
  146.           r := !m
  147.         end else begin
  148.           l := !m + 1
  149.         end
  150.       done;
  151.       if !r = 0 then begin
  152.         w := abs tab.(!r)
  153.       end else begin
  154.         w := min (abs tab.(!r - 1)) (abs tab.(!r))
  155.       end
  156.     end;
  157.     !w
  158.   end
  159. ;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement