Aller au contenu

Conversion numérique->minéralogique (et inversement)


Messages recommandés

Posté(e)

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)
)

 

Amicalement

Vincent

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)

Posté(e)

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

Posté(e)

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.

 

Amicalement

Vincent

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)

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité