Sys.command "ocaml -version";; let denombrement_regles n = 3. ** (n *. (2. ** (n -. 1.)));; denombrement_regles 3.;; denombrement_regles 4.;; type caractere = int;; type suite_caracteres = caractere array;; type symbole = string;; type codage = (suite_caracteres * symbole);; type codage_hamming = codage list;; let n = 7 ;; let suite1 : suite_caracteres = [| 0;0;0;0;0;0;0 |];; let suite2 : suite_caracteres = [| 1;1;1;1;1;1;1 |];; let suite3 : suite_caracteres = [| 0;1;0;1;0;1;0 |];; let suite4 : suite_caracteres = [| 1;0;1;0;1;0;1 |];; let codage_ex1 : codage_hamming = [ (suite1, "A"); (suite2, "B"); (suite3, "C"); (suite4, "D") ];; let quel_symbole (code : codage_hamming) (suite : suite_caracteres) : symbole = List.assoc suite code ;; quel_symbole codage_ex1 suite3;; (* = "C" *) let sans_j tab j = let n = Array.length tab in let indice i = if i < j then i else i + 1 in Array.init (n - 1) (fun i -> tab.(indice i)) (* Autre approche : let gauche = j and droite = n - j - 1 in Array.append (Array.init gauche (fun i -> tab.(i))) (Array.init droite (fun i -> tab.(j + i + 1))) *) ;; sans_j [|0;1;2;3|] 0;; sans_j [|0;1;2;3|] 1;; sans_j [|0;1;2;3|] 2;; sans_j [|0;1;2;3|] 3;; [|1;2;3|] = [|3;4;1|];; [|1;2;3|] = [|1;2;3|] let est_issue_de_en_j (seq_i : suite_caracteres) (seq : suite_caracteres) (j : int) = let seq_i_sansj = sans_j seq_i j in let seq_sansj = sans_j seq j in seq_i_sansj = seq_sansj ;; suite1;; est_issue_de_en_j suite1 suite1 0;; let suite1_delta0 = [|1; 0; 0; 0; 0; 0; 0|];; est_issue_de_en_j suite1 suite1_delta0 0;; est_issue_de_en_j suite1 suite1_delta0 1;; est_issue_de_en_j suite1 suite1_delta0 4;; est_issue_de_en_j suite1 suite1_delta0 6;; let suite1_delta5 = [|0; 0; 0; 0; 0; 1; 0|];; est_issue_de_en_j suite1 suite1_delta5 3;; est_issue_de_en_j suite1 suite1_delta5 4;; est_issue_de_en_j suite1 suite1_delta5 5;; est_issue_de_en_j suite1 suite1_delta5 6;; let est_issue_de (seq_i : suite_caracteres) (seq : suite_caracteres) = let taille = Array.length seq_i in let bon_j = ref (-1) in let nb_bon_j = ref 0 in (* Pour chaque *) for j = 0 to taille - 1 do if est_issue_de_en_j seq_i seq j then begin bon_j := j; (* s'ils diffèrent en cette case, ie si une vraie modification était nécessaire *) if seq_i.(j) != seq.(j) then incr nb_bon_j; end; done; (* Vérifie qu'au maximum une vraie modification a été utilisée *) assert (!nb_bon_j <= 1); (* 0 <= !bon_j, !bon_j, !nb_bon_j *) (* pour tester *) 0 <= !bon_j ;; est_issue_de suite1 suite1;; est_issue_de suite1 suite1_delta0;; est_issue_de suite1 suite1_delta5;; let suite1_4delta = [|1; 1; 0; 1; 0; 1; 0|];; est_issue_de suite1 suite1_4delta;; (* false *) let decodage_une_sequence (code : codage_hamming) (seq : suite_caracteres) : symbole = let bon_indice = ref (-1) in let nb_bonne_seqi = ref 0 in (* Pour chaque seq_i du codage de Hamming *) List.iteri ( fun i (seq_i, sym) -> ( if est_issue_de seq_i seq then begin bon_indice := i; incr nb_bonne_seqi; end; ) ) code; (* Vérifie qu'une seule séquence du codage soit valide *) assert (!nb_bonne_seqi = 1); (* Associe le symbole de la seule séquence du codage qui soit valide *) let bonne_seqi = fst (List.nth code !bon_indice) in quel_symbole code bonne_seqi ;; codage_ex1;; suite1;; decodage_une_sequence codage_ex1 suite1;; suite1_delta0;; decodage_une_sequence codage_ex1 suite1_delta0;; suite1_delta5;; decodage_une_sequence codage_ex1 suite1_delta5;; suite1_4delta;; decodage_une_sequence codage_ex1 suite1_4delta;; (* va trouver "C" *) suite2;; decodage_une_sequence codage_ex1 suite2;; let suite2_delta6 = [|1; 1; 1; 1; 1; 1; 0|];; decodage_une_sequence codage_ex1 suite2_delta6;; suite3;; decodage_une_sequence codage_ex1 suite3;; let suite3_delta3 = [|0; 1; 0; 0; 0; 1; 0|];; decodage_une_sequence codage_ex1 suite3_delta3;; suite4;; decodage_une_sequence codage_ex1 suite4;; let suite4_delta1 = [|1; 1; 1; 0; 1; 0; 1|];; decodage_une_sequence codage_ex1 suite4_delta1;; let taille_sequences_codage (code : codage_hamming) = let tailles = List.map (fun (seq, sym) -> Array.length seq) code in let taille = List.hd tailles in (* On vérifie que toutes les séquence du codage aient cette même taille ! *) assert (List.for_all (( = ) taille) tailles); taille ;; let n1 = taille_sequences_codage codage_ex1 ;; let seq_ex1 : suite_caracteres = [| 1;1;0;1;0;1;0; 1;0;1;1;1;0;1; 1;0;0;0;0;0;0; 0;1;1;1;1;1;1 |];; Array.sub;; Array.init;; ArrayLabels.sub;; ArrayLabels.init;; Array.sub seq_ex1 ((2 - 1) * 7) 7;; ArrayLabels.sub seq_ex1 ~pos:((2 - 1) * 7) ~len:7;; let decoupe_sequence (seq : suite_caracteres) (n : int) : suite_caracteres list = let len = Array.length seq in let k = len / n in assert (len = (k * n)); (* Test, bonus *) Array.to_list ( Array.init k (fun i -> Array.sub seq (i * n) n ) ) ;; decoupe_sequence seq_ex1 n1;; let decodage_sequences (code : codage_hamming) (seq : suite_caracteres) : symbole list = let n = taille_sequences_codage code in let seqs = decoupe_sequence seq n in List.map (decodage_une_sequence code) seqs ;; decodage_sequences codage_ex1 seq_ex1;;