De: Laurent Longre Objet: Re: transformer nombre Date : samedi 21 octobre 2000 15:50 Bonjour Jacques, Voici deux fonctions qui devraient te satisfaire: MORSE() pour encoder un texte (ou un nombre) en morse, MORSEINVERSE() pour décoder un code morse. Les codes morse sont séparés par des espaces. Le texte à encoder ne doit bien sûr comporter aucun point ni tiret. Les caractères qui ne correspondent ni à des lettre non accentués ni à des chiffres ("à", "é", "?", "!" etc.) sont laissés tels quels dans le code morse. La fonction MORSEINVERSE met toutes les lettres en majuscules, le code morse ne distinguant évidemment pas la casse des caractères. Exemple : =MORSE("Bonjour a tous !") ...renvoie "-... --- -. .--- --- ..- .-. .- - --- ..- ... !" Et =MORSINVERSE("-... --- -. .--- --- ..- .-. .- - --- ..- ... !") ...renvoie bien sûr "BONJOUR A TOUS !" Comme tu y fais allusion, je reproduis également ici ma fonction ROMINVERSE. J'anticipe sur la suite : comme tu vas ensuite me demander comment convertir des nombres du morse vers les chiffres romains, sache que tu peux utiliser la formule =ROMAIN(MORSINVERSE(Nombre_morse)). Et pour convertir des chiffres romains en morse: =MORSE(ROMINVERSE(Nombre_romain)). Par exemple, =ROMAIN(MORSINVERSE("..--- -.... ...-- --...")) renvoie "MMDCXXXVII" (soit 2637). Et =MORSE(ROMINVERSE("MMDCXXXVII")) renvoie "..--- -.... ...-- --...". Pour passer du volapuk vers la numération hiéroglyphique, je ne sais pas encore, mais sois sûr que je réfléchis activement à la question. '================================================================== '----------------------------- ' Encodage d'un texte en morse '----------------------------- Function MORSE(ByVal Texte As String) Dim CMorse, CNorm, C As String Dim I As Integer, L As Integer, M As Integer CNorm = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", _ "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") CMorse = Array("-----", ".----", "..---", "...--", "....-", _ ".....", "-....", "--...", "---..", "----.", ".-", "-...", _ "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", _ "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", _ "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..") Texte = UCase$(Texte) L = Len(Texte) On Error Resume Next For I = 1 To L C = Mid$(Texte, I, 1) If C Like "[.-]" Then MORSE = CVErr(xlErrValue): Exit Function M = Application.Match(C, CNorm) - 1 If CNorm(M) = C Then MORSE = MORSE & CMorse(M) _ Else MORSE = MORSE & C If I < L And C <> " " Then MORSE = MORSE & " " Next I End Function '-------------------------- ' Décodage d'un texte morse '-------------------------- Function MORSINVERSE(Texte As String) As String Dim CMorse, CNorm, C As String, J As Integer Dim I As Integer, L As Integer, M As Integer CNorm = Array("T", "M", "O", "0", "E", "N", "G", "9", "A", "K", _ "Q", "W", "Y", "J", "1", "I", "D", "Z", "8", "R", "C", "P", "U", _ "X", "2", "S", "B", "7", "L", "F", "V", "3", "H", "6", "4", "5") CMorse = Array("-", "--", "---", "-----", ".", "-.", "--.", _ "----.", ".-", "-.-", "--.-", ".--", "-.--", ".---", ".----", _ "..", "-..", "--..", "---..", ".-.", "-.-.", ".--.", "..-", _ "-..-", "..---", "...", "-...", "--...", ".-..", "..-.", _ "...-", "...--", "....", "-....", "....-", ".....") L = Len(Texte) On Error Resume Next I = 1 Do Do J = InStr(I, Texte, " ") If J <> I Then Exit Do MORSINVERSE = MORSINVERSE & " " I = I + 1 Loop C = Mid$(Texte, I, IIf(J, J, L + 1) - I) M = Application.Match(C, CMorse) - 1 If CMorse(M) = C Then MORSINVERSE = MORSINVERSE & CNorm(M) _ Else MORSINVERSE = MORSINVERSE & C I = J + 1 Loop While J End Function '---------------------------------------------------------------------- ' Conversion d'un nombre < 4000 en chiffres romains (style "classique") '---------------------------------------------------------------------- Function ROMINVERSE(Nombre As String) Const Symb = "IVXLCDM" Dim I As Integer, J As Integer Dim K As Integer, L As Integer, S As Integer Dim C As String * 1, Prec As Boolean On Error GoTo Erreur I = Len(Nombre) Do K = InStr(1, Symb, Mid$(Nombre, I, 1)) If K = 0 Or K = J Then Err.Raise xlErrValue S = IIf(K Mod 2, 1, 5) * 10 ^ ((K - 1) \ 2) If K < J Then If Not Prec Then Err.Raise xlErrValue Select Case Mid$(Nombre, I, 2) Case Is = "ID", Is = "IM", Is = "VX", Is = "VD", _ Is = "VM", Is = "LC", Is = "DM" Err.Raise xlErrValue End Select ROMINVERSE = ROMINVERSE - S I = I - 1 Prec = False ElseIf K Mod 2 Then C = Mid$(Symb, K, 1) L = 0 Do If Mid$(Nombre, I, 1) = C Then If L = 3 Then Err.Raise xlErrValue ROMINVERSE = ROMINVERSE + S I = I - 1 L = L + 1 Else Prec = L = 1 Exit Do End If Loop While I Else ROMINVERSE = ROMINVERSE + S I = I - 1 Prec = True End If J = K Loop While I Exit Function Erreur: ROMINVERSE = CVErr(Err) End Function '================================================================== Cordialement, .-.. .- ..- .-. . -. - Jacques Thiernesse a écrit : > > Bonjour, > Vu le succès grandissant de cette question qui consiste à transformer les > nombres chiffres en lettres, j'avais pensé à une variante: transformer les > nombres en chiffres romains. Il y a eu des réponses. > Afin de départager les ex-aequo, voici la question: comment transformer les > nombres-chiffres en morse? > Seules les cent premières réponses seront retenues. > Si de nouveaux ex aequo, la question consistera à transformer les chiffres > romains en morse. > A vos plumes et bonnne fin de semaine > > -- > ------------------------------------------- > « Les remarques des fautes d'un ouvrage se feront avec modestie et civilité, > et la correction en sera soufferte de la mesme sorte. » > (Statuts & Reglemens de l'Academie françoise du 22 février 1635, art. XXXIV) > > (s) Jacques > j.thiernesse@skynet.be