(* Question 5 *) let rec flat = function | [] -> [] | t::q -> t @ (flat q) ;; (* Question 6 *) let rec intervalle i j = if i>j then [] else i::(intervalle (i+1) j) ;; let list_of_bande h g d m = map (fun j -> m.(h).(j)) (intervalle g d) ;; (* Question 7 *) let list_of_zone h b g d m = flat (map (fun i -> list_of_bande i g d m) (intervalle h b)) ;; (* Question 8 *) let list_of_bloc k m = let g = 3*(k/3) and h = 3*(k mod 3) in list_of_zone (g) (g+2) (h) (h+2) m ;; (* Question 9 *) let bonne_liste l = let l19 = intervalle 1 9 in sort__sort (prefix <) l = l19 ;; (* Question 10 *) let l08 = intervalle 0 8 ;; let bon_sudoku m = let lignes = map (fun i -> list_of_bande i 0 8 m) l08 and colonnes = map (fun j -> list_of_zone 0 8 j j m) l08 and blocs = map (fun k -> list_of_bloc k m) l08 in for_all bonne_liste lignes && for_all bonne_liste colonnes && for_all bonne_liste blocs ;; (* variante: for_all bonne_liste (lignes @ colonnes @ blocs) *) let m = [| [|1;3;5;2;4;6;8;9;7|]; [|6;9;8;5;3;7;1;2;4|]; [|7;2;4;1;8;9;3;5;6|]; [|8;4;6;7;2;3;5;1;9|]; [|5;7;3;9;1;4;6;8;2|]; [|2;1;9;8;6;5;4;7;3|]; [|4;8;2;3;7;1;9;6;5|]; [|9;6;1;4;5;2;7;3;8|]; [|3;5;7;6;9;8;2;4;1|] |] ;; let f = it_list (prefix &) true ;; (* version 1 *) let bon_sudoku m = let lignes = map (fun i -> list_of_bande i 0 8 m) l08 and colonnes = map (fun j -> list_of_zone 0 8 j j m) l08 and blocs = map (fun k -> list_of_bloc k m) l08 in f(map f (map (map bonne_liste) [lignes;colonnes;blocs])) ;; (* version 2 *) let bon_sudoku m = let f1 = fun i -> list_of_bande i 0 8 m and f2 = fun j -> list_of_zone 0 8 j j m and f3 = fun k -> list_of_bloc k m in for_all bonne_liste (flat(map (fun f -> map f l08) [f1;f2;f3])) ;;