let qfile = "qqs.ml" ;;
let formatter = Format.(make_formatter (fun _ _ _ -> ()) (fun () -> ())) ;;
Topdirs.dir_use formatter (if Sys.file_exists qfile then qfile else Sys.getenv "HOME" ^ "/Exam-OCaml/" ^ qfile) ;;
let rec f1 = function
| [] -> []
| [x] -> []
| x :: y :: rest -> if x <= y then f1 (y :: rest) else (y :: rest)
let () = q1 { ff = f1 } ;;
let f2 g =
try g () ; None
with e -> Some e
let () = q2 { ff = f2 } ;;
let get_vv c = c.vv
let get_nn c = c.nn
let f3 l = (List.map get_vv l, List.map get_nn l)
let rec f3 = function
| [] -> [], []
| c :: rest ->
let (l1, l2) = f3 rest in
(c.vv :: l1, c.nn :: l2)
let f3 l =
let rec aux acu1 acu2 = function
| [] -> (List.rev acu1, List.rev acu2)
| c :: rest -> aux (c.vv :: acu1) (c.nn :: acu2) rest
in
aux [] [] l
let () = q3 { ff = f3 } ;;
let apply_filter c = function
| Equal x -> c.vv = x
| GT x -> c.nn > x
let f4 ff ll = List.filter (fun c -> List.for_all (apply_filter c) ff) ll
let rec f4 ff = function
| [] -> []
| c :: rest ->
if List.for_all (fun filter -> apply_filter c filter) ff
then c :: f4 ff rest else f4 ff rest
let for_all f l = List.fold_left (fun acu x -> acu && f x) true l ;;
let () = q4 { ff = f4 } ;;
let rec f5 = function
| [] -> []
| [_] -> []
| c1 :: c2 :: rest -> { vv = c2.vv ; nn = c1.nn } :: f5 (c2 :: rest)
let () = q5 { ff = f5 } ;;
let f6 l =
let all_vv = List.fold_left (fun acu c -> if List.mem c.vv acu then acu else c.vv :: acu) [] l in
let rec find_mean v sum nb = function
| [] -> sum / nb
| c :: rest -> if c.vv = v then find_mean v (sum + c.nn) (nb + 1) rest else find_mean v sum nb rest
in
List.map ( fun v -> { vv = v ; nn = find_mean v 0 0 l } ) all_vv
let () = q6 { ff = f6 } ;;
let f7 tree =
let rec aux acu low upp = function
| Z -> acu
| C c -> if c.nn < low || c.nn > upp then c :: acu else acu
| S (left, cmp, right) ->
let acu2 = aux acu low (min upp cmp) left in
aux acu2 (max low cmp) upp right
in
aux [] min_int max_int tree
let () = q7 { ff = f7 } ;;