diff --git a/2A/S4/Automates/TP/.idea/misc.xml b/2A/S4/Automates/TP/.idea/misc.xml
index 07115cdf15dd408d3affb9240e112578e04abf68..0b86bb30ccd2d26bb7cad6bac556d7834324a58b 100644
--- a/2A/S4/Automates/TP/.idea/misc.xml
+++ b/2A/S4/Automates/TP/.idea/misc.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="openjdk-21 (WSL)" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/out" />
   </component>
 </project>
\ No newline at end of file
diff --git a/2A/S4/Automates/TP/src/main/kotlin/Automates/Adresse.kt b/2A/S4/Automates/TP/src/main/kotlin/Automates/Adresse.kt
new file mode 100644
index 0000000000000000000000000000000000000000..50d5740ec9d1dbc90d08656aa41ded55380c4956
--- /dev/null
+++ b/2A/S4/Automates/TP/src/main/kotlin/Automates/Adresse.kt
@@ -0,0 +1,58 @@
+package Automates
+
+import Etat
+
+class Adresse() : Automate() {
+
+    init {
+        var E0 = Etat()
+        var E1 = Etat()
+        var E2 = Etat()
+        var E3 = Etat()
+
+        var chars = arrayOf("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", "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", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "-", "_")
+        S = arrayOf<Etat>(E0, E1, E2, E3)
+        A = arrayOf("@", ";")
+        A += chars
+        delta = arrayOf(
+            arrayOf(E0, chars, E1),
+            arrayOf(E1, chars, E1),
+            arrayOf(E1, "@", E2),
+            arrayOf(E2, chars, E3),
+            arrayOf(E3, chars, E3),
+            arrayOf(E3, ";", E0)
+        )
+        s0 = E0
+        sf = arrayOf(E3)
+        init_transitions_by_delta()
+    }
+
+    override fun run_automate(str : String) : String{
+        var etatCourant = s0
+        var OK : Boolean = false
+        for (char in str){
+            var charCourant = char.toString()
+            if(charCourant in A) {
+                var etatSuivant = etatCourant.donne_suivant(charCourant)
+                if (etatSuivant != null){
+                    etatCourant= etatSuivant
+                    OK = false
+                    if (etatCourant in sf) {
+                        OK = true
+                    }
+                }else{
+                    OK = false
+                }
+            }else{
+                OK = false
+            }
+        }
+        if (OK){
+            return "OK"
+        }else{
+            return "KO"
+        }
+    }
+
+
+}
\ No newline at end of file
diff --git a/2A/S4/Automates/TP/src/main/kotlin/Automates/Automate.kt b/2A/S4/Automates/TP/src/main/kotlin/Automates/Automate.kt
index ac8c911b45c1952932d252277ebc1372ee3f0b00..5ef0230e3e7ae7ef7567340e1cf7426ede34dd3d 100644
--- a/2A/S4/Automates/TP/src/main/kotlin/Automates/Automate.kt
+++ b/2A/S4/Automates/TP/src/main/kotlin/Automates/Automate.kt
@@ -16,8 +16,15 @@ abstract class Automate (){
         for (etat in S){
             for (transition in delta){
                 if (etat == transition[0]){
-                    key.add(transition[1] as String)
-                    value.add(transition[2] as Etat)
+                    if (transition[1] is Array<*>){
+                        for (elmt in transition[1] as Array<*>){
+                            key.add(elmt as String)
+                            value.add(transition[2] as Etat)
+                        }
+                    }else {
+                        key.add(transition[1] as String)
+                        value.add(transition[2] as Etat)
+                    }
                 }
             }
             etat.init_transition(key,value)
@@ -26,14 +33,13 @@ abstract class Automate (){
         }
     }
 
-    fun run_automate(str : String) : String{
+    open fun run_automate(str : String) : String{
         var etatCourant = s0
-        var currentChar : String
-
-        for (index in 0..str.length){
-            currentChar = str[index].toString()
-            if(currentChar in A) {
-                var etatSuivant = etatCourant.donne_suivant(currentChar)
+        var charCourant : String
+        for (char in str){
+            charCourant = char.toString()
+            if(charCourant in A) {
+                var etatSuivant = etatCourant.donne_suivant(charCourant)
                 if (etatSuivant != null){
                     etatCourant= etatSuivant
                     if (etatCourant in sf) {
diff --git a/2A/S4/Automates/TP/src/main/kotlin/Automates/HHMM.kt b/2A/S4/Automates/TP/src/main/kotlin/Automates/HHMM.kt
index c14df0056d2adc051ebee351fbd2f27189cf95b8..0f7a953332d4bcfb1d299a36059f642cd390a441 100644
--- a/2A/S4/Automates/TP/src/main/kotlin/Automates/HHMM.kt
+++ b/2A/S4/Automates/TP/src/main/kotlin/Automates/HHMM.kt
@@ -2,6 +2,7 @@ package Automates
 import Etat
 
 class HHMM() : Automate() {
+
     init{
         var E0 = Etat()
         var H1 = Etat()
@@ -10,32 +11,26 @@ class HHMM() : Automate() {
         var M1 = Etat()
         var M2 = Etat()
         var M = Etat()
+
+        var ZeroToOne = arrayOf("0", "1")
+        var ZeroToNine = arrayOf("0","1","2","3","4","5","6","7","8","9")
+        var ZeroToFive = arrayOf("0","1","2","3","4","5")
+        var ZeroToThree = arrayOf("0", "1", "2", "3")
         S = arrayOf(E0,H1,H2,H,M1,M2,M)
         A = arrayOf(":","0","1","2","3","4","5","6","7","8","9")
         delta = arrayOf(
-            arrayOf(E0,"0",H1),
-            arrayOf(E0,"1",H1),
-            arrayOf(E0,"2",H2),
-            arrayOf(H,":",M),
+            arrayOf(E0, ZeroToOne, H1),
+            arrayOf(E0, "2", H2),
+            arrayOf(H, ":", M),
+            arrayOf(H1, ZeroToNine, H),
+            arrayOf(M2, ZeroToNine, M),
+            arrayOf(M1, ZeroToFive, M),
+            arrayOf(H2, ZeroToThree, H)
         )
-        for(etat in S){
-            if(etat == H1){
-                for(i in 0..9){
-                    delta += arrayOf(H1,i.toString(),H)
-                    delta += arrayOf(M2,i.toString(),M)
-                }
-            }else if(etat == M1){
-                for(i in 0..5){
-                    delta += arrayOf(M1,i.toString(),M)
-                }
-            } else if(etat == H2){
-                for(i in 0..3){
-                    delta += arrayOf(H2,i.toString(),H)
-                }
-            }
-        }
         s0 = E0
         sf = arrayOf(M)
+
         init_transitions_by_delta()
+
     }
 }
\ No newline at end of file
diff --git a/2A/S4/Automates/TP/src/main/kotlin/Automates/JJMMAAAA.kt b/2A/S4/Automates/TP/src/main/kotlin/Automates/JJMMAAAA.kt
index d14a80c2a35c11cd2bcf61c5447191932253749e..e61b44380db6aa9bc64078ee65d9315637f466dd 100644
--- a/2A/S4/Automates/TP/src/main/kotlin/Automates/JJMMAAAA.kt
+++ b/2A/S4/Automates/TP/src/main/kotlin/Automates/JJMMAAAA.kt
@@ -2,27 +2,79 @@ package Automates
 import Etat
 
 class JJMMAAAA() : Automate() {
-    init{
+
+    init {
         var E0 = Etat()
         var E1 = Etat()
         var E2 = Etat()
         var E3 = Etat()
         var E4 = Etat()
-        S = arrayOf(E0,E1,E2,E3,E4)
-        A = arrayOf(";",":","]","=","-","(",")")
+        var E5 = Etat()
+        var E6 = Etat()
+        var E7 = Etat()
+        var E8 = Etat()
+        var E9 = Etat()
+        var E10 = Etat()
+        var E11 = Etat()
+        var E12 = Etat()
+        var E13 = Etat()
+        var E14 = Etat()
+        var E15 = Etat()
+        var E16 = Etat()
+        var E17 = Etat()
+        var E18 = Etat()
+        var E19 = Etat()
+        var E20 = Etat()
+        var E21 = Etat()
+        var E22 = Etat()
+
+
+        var action_list1 = arrayOf("0", "1", "2", "3", "4", "5", "6", "7", "8", "9")
+        var action_list2 = arrayOf("0", "1", "2", "3", "4", "5", "6", "7", "8")
+        var action_list3 = arrayOf("0", "1", "2", "3", "4", "5", "6", "7", "8", "9")
+        var action_list4 = arrayOf("0", "1", "2")
+        var action_list5 = arrayOf("1", "3", "5", "7", "8")
+        var action_list6 = arrayOf("0", "2")
+        var action_list7 = arrayOf("1", "3", "4", "5", "6", "7", "8", "9")
+
+        S = arrayOf(E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22)
+        A = arrayOf("/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9")
         delta = arrayOf(
-            arrayOf(E0,":",E1),
-            arrayOf(E0,";",E2),
-            arrayOf(E0,"]",E2),
-            arrayOf(E1,"=",E3),
-            arrayOf(E1,"-",E3),
-            arrayOf(E1,"(",E4),
-            arrayOf(E1,")",E4),
-            arrayOf(E2,"-",E3),
-            arrayOf(E3,")",E4)
+            arrayOf(E0, "0", E4),
+            arrayOf(E0, "1", E3),
+            arrayOf(E0, "2", E2),
+            arrayOf(E0, "3", E1),
+            arrayOf(E1, "1", E7),
+            arrayOf(E1, "0", E6),
+            arrayOf(E2, "9", E6),
+            arrayOf(E2, action_list2, E5),
+            arrayOf(E3, action_list1, E5),
+            arrayOf(E4, action_list3, E5),
+            arrayOf(E7, "/", E8),
+            arrayOf(E6, "/", E9),
+            arrayOf(E5, "/", E10),
+            arrayOf(E8, "0", E11),
+            arrayOf(E8, "1", E12),
+            arrayOf(E9, "0", E13),
+            arrayOf(E9, "1", E14),
+            arrayOf(E10, "1", E14),
+            arrayOf(E10, "0", E15),
+            arrayOf(E11, action_list5, E16),
+            arrayOf(E12, action_list6, E16),
+            arrayOf(E13, action_list7, E16),
+            arrayOf(E14, action_list4, E16),
+            arrayOf(E15, action_list3, E16),
+            arrayOf(E16, "/", E17),
+            arrayOf(E17, action_list1, E18),
+            arrayOf(E18, action_list1, E19),
+            arrayOf(E19, action_list3, E20),
+            arrayOf(E19, "0", E21),
+            arrayOf(E20, action_list1, E22),
+            arrayOf(E21, action_list3, E22)
         )
         s0 = E0
-        sf = arrayOf(E4)
+        sf = arrayOf(E22)
         init_transitions_by_delta()
     }
+
 }
\ No newline at end of file
diff --git a/2A/S4/Automates/TP/src/main/kotlin/Main.kt b/2A/S4/Automates/TP/src/main/kotlin/Main.kt
index e345d5c3965b07a78de6d8e43f636ee6226bc14b..af5b9771270ad226a6259721e8b370cb93cedc0f 100644
--- a/2A/S4/Automates/TP/src/main/kotlin/Main.kt
+++ b/2A/S4/Automates/TP/src/main/kotlin/Main.kt
@@ -1,8 +1,57 @@
-import Automates.HHMM
-import Automates.Smiley
+import Automates.*
+import kotlin.system.exitProcess
 
 fun main(args: Array<String>) {
-    println("Hello World!")
+    var continu = true
+    while (continu) {
+        println(
+            "------------------------- Menu -------------------------\n" +
+                    "1. Smiley (pour reconnaitre un des smileys)\n" +
+                    "2. HH:MM (pour reconnaitre une heure bien formée)\n" +
+                    "3. JJ/MM/AAAA\n" +
+                    "4. Adresses électroniques\n" +
+                    "...\n" +
+                    "99. Arrêt de l'application\n" +
+                    "Votre choix (1-99) ?\n" +
+                    "Je vous demanderai ensuite la chaîne à analyser, Merci\n" +
+                    "--------------------------------------------------------\n"
+        )
+
+        var input = readLine()
+        var autoChoice = ""
+        var automate : Automate = Smiley()
+
+        if (input == "1") {
+            automate = Smiley()
+            autoChoice = "Smiley"
+        } else if (input == "2") {
+            automate = HHMM()
+            autoChoice = "HHMM"
+        } else if (input == "3") {
+            automate = JJMMAAAA()
+            autoChoice = "JJMMAAAA"
+        } else if (input == "4") {
+            automate = Adresse()
+            autoChoice = "Adresse"
+        } else if (input == "99") {
+            println("Bye")
+            exitProcess(0)
+        }
+
+        println("Vous avez choisi ${autoChoice}. Tapez la chaîne à analyser")
+
+        input = readLine()
+        var str = input.toString()
+        var OKKO = automate.run_automate(str)
+
+        println("Résultat de l'analyse : ${OKKO}")
+        println(" ")
+        println("Entrée pour continuer ou quitter")
+
+        input = readLine()
+
+
+    }
 
     // Try adding program arguments via Run/Debug configuration.
     // Learn more about running applications: https://www.jetbrains.com/help/idea/running-applications.html.