diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..d3cdafe79193b58574ffc1e934bab278e90f16d2
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,7 @@
+CC=ocamlc
+FLAGS=
+
+all: main.out
+
+main.out: src/main.ml
+	$(CC) $(FLAGS) -o bin/$@ $< 
diff --git a/bin/main.out b/bin/main.out
new file mode 100755
index 0000000000000000000000000000000000000000..853635e75b272ac6cd770ab0de447022d30cfe67
Binary files /dev/null and b/bin/main.out differ
diff --git a/src/.main.ml.swp b/src/.main.ml.swp
new file mode 100644
index 0000000000000000000000000000000000000000..3d7974d031461db160c1b5f4e2efd87ccd974c68
Binary files /dev/null and b/src/.main.ml.swp differ
diff --git a/src/main.cmi b/src/main.cmi
new file mode 100644
index 0000000000000000000000000000000000000000..6cbabdbc13301f8aa24da602d401972daa8fbb0e
Binary files /dev/null and b/src/main.cmi differ
diff --git a/src/main.cmo b/src/main.cmo
new file mode 100644
index 0000000000000000000000000000000000000000..75dc3bc49d33ac8e12eae058a00efa8f032b23e7
Binary files /dev/null and b/src/main.cmo differ
diff --git a/src/main.ml b/src/main.ml
new file mode 100644
index 0000000000000000000000000000000000000000..9b3d38ef13a18c23ac0a941087b2cd6f6f59657b
--- /dev/null
+++ b/src/main.ml
@@ -0,0 +1,59 @@
+(*
+ * author : Loïc Dubard
+ * file: main.ml
+ * Fichier principal
+ * date : 03-03-2019
+ * *)
+
+(* [split_string s] retourne la liste de caracteres correspondant à la chaine [s] *)
+let split_string s =
+  let rec aux i n =
+    if i >= n
+    then []
+    else (String.get s i)::aux (i+1) n
+  in
+  aux 0 (String.length s);;
+
+(* [parse_input ()] lit deux lignes sur l'entree standard du programme.
+   La premiere doit comporter un entier, la seconde une chaine de caracteres.
+   Retourne un couple composé de l'entier de la premiere ligne et de la liste des caracteres de la seconde.
+
+   Leve l'exception [Failure "int_of_string"] si la premiere ligne ne represente pas un entier.
+ *)
+
+let parse_input () =
+  let nb_antennas = int_of_string (read_line ()) in
+  let phrase = read_line () in
+  nb_antennas,split_string phrase;;
+
+(*let print_elt n (i,l) = print_char (List.nth l n);;
+
+print_elt 1 (parse_input());;*)
+
+(*définition de la roue*)
+let roue = ' '::'A'::'B'::'C'::'D'::'E'::'F'::'G'::'H'::'I'::'J'::'K'::'L'::'M'::'N'::'O'::'P'::'Q'::'R'::'S'::'T'::'U'::'V'::'W'::'X'::'Y'::'Z'::[];;
+
+(*[translate c] traduit le charactère c en sa commande
+ * la limite d'optimalité pour choisir entre P et N est le charactère 'M' qui demande 13N et 14P*)
+exception BadCharacter of char;;
+let translate c = 
+    (*[char_to_index i a r] cherche récursivement l'indice du charactère a dans la roue r*)
+    let rec char_to_index i a r= 
+        match r with 
+            | [] -> raise (BadCharacter a)
+            | e::l -> if a == e then i
+                      else char_to_index (i+1) a l  
+    in
+        let n = char_to_index 0 c roue in 
+             if (n < 14) then String.concat "" ((String.make n 'N')::"E"::[])
+             else String.concat "" ((String.make (27-n) 'P')::"E"::[]);;
+
+(*[commande (i,l)] prend le résultat de l'input et renvoie la commande complète associée'*)
+(*let commande (i,l) = List.fold_left (fun acc e -> (String.concat "" (acc::(translate e)::[]))) [] l;;*)
+exception InputVide;;
+let rec commande (i,l) = match l with
+    | [] -> ""
+    | e::r -> String.concat "" ((translate e)::(commande (i,r))::[]);;
+
+
+print_string (commande (parse_input()));;