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

Aller au contenu

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

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

#1 L'utilisateur est hors-ligne   zebulon_ 

  • ceinture noire 2em dan
  • Groupe : Membres
  • Messages : 1308
  • Inscrit(e) : 02-mai 03
  • LocationSchnersheim

Posté 19 février 2016 - 17:04

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

#2 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 10943
  • Inscrit(e) : 02-septembre 05

Posté 19 février 2016 - 17:50

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 -
Développements sur mesure pour AutoCAD
Image IPB
0

#3 L'utilisateur est hors-ligne   zebulon_ 

  • ceinture noire 2em dan
  • Groupe : Membres
  • Messages : 1308
  • Inscrit(e) : 02-mai 03
  • LocationSchnersheim

Posté 21 février 2016 - 18:31

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

Partager ce sujet :


Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)