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 x acu = function
| [] -> acu
| y :: ys -> f1 x (if x = y then acu else y :: acu) ys
;;
let () = q1 { ff = f1 } ;;
let f2 f e1 = try f () ; false with e2 -> e1 = e2
;;
let () = q2 { ff = f2 } ;;
let f3 s c ll = List.length (List.filter (fun t -> t.size = s && t.color = c) ll)
let rec f3 s c = function
| [] -> 0
| t :: rest -> if t.size = s && t.color = c then 1 + f3 s c rest else f3 s c rest
;;
let () = q3 { ff = f3 } ;;
let f4 ll = List.filter (fun t -> t.color <> White) ll
;;
let () = q4 { ff = f4 } ;;
let insert x l = if List.mem x l then l else x :: l
let f5 c ll = List.fold_left (fun acu t -> if t.color = c then insert t.message acu else acu) [] ll
;;
let () = q5 { ff = f5 } ;;
let ins f asso t =
let key = f t in
let rec loop acu = function
| [] -> (key, [t]) :: acu
| (k,l) as p :: rest ->
if k = key then List.rev_append ((k, t :: l) :: acu) rest
else loop (p :: acu) rest
in
loop [] asso
;;
let f6 ll = List.fold_left (ins (fun t -> t.size)) [] ll
;;
let () = q6 { ff = f6 } ;;
let f7 tree =
let rec loop (idmin,pmin) t =
let acu0 = if t.value.price < pmin then (t.id, t.value.price) else (idmin, pmin) in
List.fold_left loop acu0 t.children
in
fst (loop (tree.id,tree.value.price) tree)
;;
let () = q7 { ff = f7 } ;;
let mk_leaf i = { value = i ; id = 0 ; children = [] }
let mk_node i l = { value = i ; id = 0 ; children = l }
let mk_tree cat crits =
let rec loop cat = function
| [] -> mk_leaf (List.length cat)
| ks :: rest -> mk_node (List.length cat) (List.map (fun k -> loop (List.filter k cat) rest) ks)
in
loop cat crits
let mk_size_crit l = List.map (fun s t -> t.size = s) l
let mk_color_crit l = List.map (fun c t -> t.color = c) l
let f8 sizes colors cat = mk_tree cat [ mk_size_crit sizes ; mk_color_crit colors ]
;;
let () = q8 { ff = f8 } ;;