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 tt ll =
tt = ll ||
match ll with
| [] -> false
| _ :: yy -> f1 tt yy
;;
let () = q1 { ff = f1 } ;;
let f2 g = try g () ; None with e -> Some e
;;
let () = q2 { ff = f2 } ;;
let f3 cat = List.filter (fun t -> t.size <> XL) cat
;;
let () = q3 { ff = f3 } ;;
let f4 c p ll = List.length (List.filter (fun t -> t.color = c && t.price <= p) ll)
let rec f4 c p = function
| [] -> 0
| t :: rest -> if t.color = c && t.price <= p then 1 + f4 c p rest else f4 c p rest
;;
let () = q4 { ff = f4 } ;;
let insert x l = if List.mem x l then l else x :: l
let f5 s ll = List.fold_left (fun acu t -> if t.size = s then insert t.color 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.color)) [] ll
;;
let () = q6 { ff = f6 } ;;
let f7 tree =
let rec loop acu t =
let acu0 = if t.value.size = XL then t.id :: acu else acu in
List.fold_left loop acu0 t.children
in
loop [] 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 } ;;