Skip to content
Extraits de code Groupes Projets
Valider 20bf31da rédigé par Loïc DUBARD's avatar Loïc DUBARD :speech_balloon:
Parcourir les fichiers

phase 2 opérationnelle

parent a624f62f
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
Aucun aperçu pour ce type de fichier
Fichier supprimé
Fichier supprimé
Aucun aperçu pour ce type de fichier
Aucun aperçu pour ce type de fichier
...@@ -43,11 +43,12 @@ let rec tourner c n roue = ...@@ -43,11 +43,12 @@ let rec tourner c n roue =
else if c='P' then List.rev (tourner 'N' n (List.rev roue)) else if c='P' then List.rev (tourner 'N' n (List.rev roue))
else roue;; else roue;;
(*[char_to_index i a r] cherche récursivement l'indice du charactère a dans la roue r*) (*[char_to_index i a r] cherche récursivement l'indice du charactère a dans la roue r
exception BadCharacter of char;; * i doit être 0 pour que ça marche*)
exception BadCharacter;;
let rec char_to_index i a r= let rec char_to_index i a r=
match r with match r with
| [] -> raise (BadCharacter a) | [] -> raise BadCharacter
| e::l -> if a = e then i | e::l -> if a = e then i
else char_to_index (i+1) a l;; else char_to_index (i+1) a l;;
...@@ -62,18 +63,77 @@ let translate c roue = ...@@ -62,18 +63,77 @@ let translate c roue =
exception InputVide;; exception InputVide;;
let rec commande (i,l) roue = match l with let rec commande (i,l) roue = match l with
| [] -> "" | [] -> ""
| e::r -> let (c,n) = translate e roue in | e::r -> let (s,n) = translate e roue in
String.concat "" (c::(commande (i,r) (tourner c.[0] n roue))::[]);; String.concat "" (s::(commande (i,r) (tourner s.[0] n roue))::[]);;
(*Résultat de la phase 1*)
let input=parse_input();;
let com = commande input roue;;
print_string (com);;
print_string (commande (parse_input()) roue);; (************************************************************Début de la phase 2************************************************************)
(*[temps_lettre l] retourne le temps necessaire pour l'emission de la commmande partielle l*)
let temps_lettre l = let temps_lettre l =
if (l='N' || l='P') then 3 if (l='N' || l='P') then 3
else if l='S' then 1 else if l='S' then 1
else if l='E' then 5 else if l='E' then 5
else 0;; else 0;;
(*
let temps_commande c = (*[temps_commande s] retourne le temps necessaire à l'emission de la commande complète s*)
let liste = split_string c in let temps_commande s =
*) let liste_char = split_string s in
let rec tps l = match l with
| [] -> 0
| e::r -> temps_lettre e + tps r
in
tps liste_char;;
(*test temps d'execution*)
Printf.printf "\n %d s\n" (temps_commande com);;
let liste_roues=roue::[]
(*[make_liste_index l c] renvoie la liste des indices où se trouve le charactère c dans chaque roue de l*)
let rec make_liste_index l c = match l with
| [] -> []
| e::r -> (char_to_index 0 c e)::(make_liste_index r c);;
(*[quelle_roue l c] renvoi l'indice de la roue (dans la liste de roues l) avec laquelle il est plus rapide de traduire c*)
let quelle_roue l c =
(*i doit être 0 lors du premier appel*)
let rec index_min m n i r = match r with
| [] -> n
| e::t -> if e < 14 then (if e < m then (index_min e i (i+1) t) else index_min m n (i+1) t)
else (if 27-e < m then (index_min (27-e) i (i+1) t) else index_min m n (i+1) t)
in
index_min (char_to_index 0 c roue) 0 (List.length l) (make_liste_index l c);;
(*[tourner_list m c n i l] tourne n fois dans le sens de c la roue d'indice i dans la liste de roues l*)
let rec tourner_list c n i l =
if i >= (List.length l) then List.append l (roue::[])
else match l with
| [] -> []
| e::t -> if i = 0 then (List.append ((tourner c n e)::[]) t)
else (List.append (e::[]) (tourner_list c n (i-1) t));;
(*[commande_phase2 (i,l) roue] traduit le message l en commande en selectionnant pour chaque lettre la bonne antenne*)
let rec commande_phase2 (i,l) liste_roues index_init = match l with
| [] -> ""
| e::t -> let index = quelle_roue liste_roues e in
let r = (if index = (List.length liste_roues) then roue else (List.nth liste_roues index)) in
let (s,n) = translate e r in
let sres = (if index = index_init then s else (String.concat "" ("S"::(string_of_int index)::s::[])) ) in
let new_liste = tourner_list s.[0] n index liste_roues in
Printf.printf "%d\n" index;
String.concat "" (sres::(commande_phase2 (i,t) new_liste index)::[]);;
(*test commande_phase2*)
let com2 = commande_phase2 input liste_roues 0;;
print_string com2;;
Printf.printf "\n %d s \n" (temps_commande com2);;
Aucun aperçu pour ce type de fichier
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter