zebulon_ Posté(e) le 19 février 2016 Posté(e) le 19 février 2016 Bonjour, le but du jeu est de faire une fonction qui fait correspondre à un nombre un texte de type plaque minéralogique (exemples : 1-> "A", 26-> "Z", 31-> "AE" etc...) et une autre fonction qui fait l'inverse. Le problème principal vient du fait que la numération minéralogique ne contient pas de 0 (le 0 est une invention géniale, on s'en rend compte ici :P) et on passe directement de "Z" à "AA", sans passer par un "Azéro". Un peu comme si on passait directement de 1..9 à 11..19 etc... en décimal ! Un handicap majeur ! (defun itoa26 (X / RES RESTE) ;; en entrée ;; X >= 1 ;; en sortie ;; numéro minéralogique correspondant ;; exemple : ;; (itoa26 28) -> "AB" ;; (setq RES "") (while (>= X 26) (setq RESTE (REM X 26) X (fix (/ X 26)) ) (and (zerop RESTE) (setq RESTE 26 X (- X 1) ) ) (setq RES (strcat (chr (+ RESTE 64)) RES)) ) (or (zerop X) (setq RES (strcat (chr (+ X 64)) RES)) ) RES ) (defun atoi26 (X / lst I RES) ;; en entrée ;; un numéro minéralogique "AB" ;; en sortie ;; numéro décimal correspondant ;; exemple : ;; (atoi26 "AB") -> 28 ;; (setq lst (reverse (vl-string->list (strcase X))) I 0 RES 0 ) (repeat (length lst) (setq RES (+ RES (* (- (nth I lst) 64) (expt 26 I))) I (1+ I) ) ) RES ) (defun c:test (/ I N) (vl-load-com) (setq I 1) (repeat 800 (print (strcat (itoa I) " " (setq N (itoa26 I)) " " (itoa (atoi26 N)) ;; pour voir si on retombe sur nos pieds ) ) (setq I (1+ I)) ) (princ) ) AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
(gile) Posté(e) le 19 février 2016 Posté(e) le 19 février 2016 Salut, J'avais fait un truc dans le genre pour le GetExcel de Terry Miller ;;------------------------------------------------------------------------------- ;; Alpha2Number - Convertit une chaîne alphabétique en nombre entier ;; Function By: Gilles Chanteau from Marseille, France ;; Arguments: 1 ;; str = Chaîne à convertir ;; Exemple de syntaxe : (Alpha2Number "BU") = 73 ;;------------------------------------------------------------------------------- (defun Alpha2Number (str / num) (if (= 0 (setq num (strlen str))) 0 (+ (* (- (ascii (strcase (substr str 1 1))) 64) (expt 26 (1- num)) ) (Alpha2Number (substr str 2)) ) ) ) ;;------------------------------------------------------------------------------- ;; Number2Alpha - Convertit un nombre entier en chaîne alphabétique ;; Function By: Gilles Chanteau from Marseille, France ;; Arguments: 1 ;; num = Nombre à convertir ;; Exemple de syntaxe : (Number2Alpha 73) = "BU" ;;------------------------------------------------------------------------------- (defun Number2Alpha (num / val) (if (< num 27) (chr (+ 64 num)) (if (= 0 (setq val (rem num 26))) (strcat (Number2Alpha (1- (/ num 26))) "Z") (strcat (Number2Alpha (/ num 26)) (chr (+ 64 val))) ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
zebulon_ Posté(e) le 21 février 2016 Auteur Posté(e) le 21 février 2016 Bonjour, c'est toujours remarquable de voir qu'un même problème peut donner une multitude de solutions. Personnellement, j'ai eu plus de mal à résoudre la conversion numérique->minéralogique. La conversion dans l'autre sens a été plus simple et, d'ailleurs, nos deux solutions sont très semblables à part que chez moi c'est une itération et chez toi une récursion. AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant