Aller au contenu

Rechercher dans la communauté

Affichage des résultats pour « challenge » dans sujets.

  • Rechercher par étiquettes

    Saisir les étiquettes en les séparant par une virgule.
  • Rechercher par auteur

Type du contenu


Forums

  • Fonctionnement de ce site
    • Nouvelle règle pour les invités : plus d'écriture possible sans inscription
    • CADxp, comment ça marche?
    • CADxp, vos souhaits
    • Forum test
  • Emploi
    • Emploi, monde du travail
  • AutoCAD
    • AutoCAD 3D
    • AutoCAD 2020-2024
    • AutoCAD LT 2024
    • AutoCAD LT 2020-2023
    • AutoCAD 2019
    • AutoCAD LT 2019
    • AutoCAD 2018
    • AutoCAD LT 2018
    • AutoCAD 2017
    • AutoCAD LT 2017
    • AutoCAD avant 2017
    • AutoCAD LT avant 2017
    • Tutoriaux AutoCAD
    • AutoCAD, liste de souhaits
  • Autres logiciels de CAO
    • Microstation
    • IntelliPlus, IntelliCAD, CadIdesk
    • ZWCAD
  • Architecture, Bâtiment
    • Revit
    • AutoCAD Architecture
    • AutoCAD MEP
    • BIM
  • Mécanique
    • Inventor
    • SolidWorks
    • Creo (ex. Pro/Engineer)
    • Catia
  • SIG, Génie civil, Cartographie, VRD
    • Autodesk Map
    • VRD
    • Covadis
    • Infraworks 360
    • Mensura
    • AutoCAD Civil
    • Autopiste
    • SIG internet
  • Imagerie, animation, PAO, modélisation 3D
    • 3DSMAX
    • Création et retouche d'images
    • Sketchup
    • Autres logiciels d'infographie
    • Lumion 3D
  • Programmation
    • LISP et Visual LISP
    • VBA et VB
    • Personnalisation, macros, DIESEL
    • ObjectARX/DBX, C++, .NET, RealDWG
    • Programmer en s'amusant
    • Suggestions de développements
  • Trucs et astuces
    • AutoCAD trucs et astuces
    • Windows trucs et astuces
  • Matériel CAO
    • Ordinateurs
    • Périphériques d'entrée
    • Périphériques de sortie, impression
  • Divers
    • CAO, généralités
    • Echanges de fichiers
    • Organisation du travail
    • Visualisateurs, annotation
    • Pause café
    • Bibliothèques de composants
    • Formation
  • Logiciels connexes
    • Devis, métré, estimation, quantitatif
    • Calculs et simulation
  • Forums métier
    • Bâtiment
    • Infrastructures

Calendriers

Il n’y a aucun résultat à afficher.

Blogs

Il n’y a aucun résultat à afficher.


Rechercher les résultats dans…

Rechercher les résultats qui contiennent…


Date de création

  • Début

    Fin


Dernière mise à jour

  • Début

    Fin


Filtrer par nombre de…

Inscription

  • Début

    Fin


Groupe


AIM


MSN


Website URL


ICQ


Yahoo


Jabber


Skype


Location


Interests

  1. Ça faisait longtemps. Le but de ce challenge est d'écrire une routine qui prend en argument une chaîne de caractères et renvoie la liste des nombres contenus dans cette chaîne. Exemple : (extraireNombres "Longueur = 25.4mm Largeur = 12.7mm Quantité = -42") renvoie : (25.4 12.7 -42)
  2. Coucou, Pour commencer, je ne recherche aucunement des programmes tout fait, tout propre chat ne m'intéresse pas :3 Mon but est simplement de trouver une logique permettant de répondre à un problème afin que je puisse par la suite transposer en programme. Donc pour faire relativement simple, il existe bon nombre de programmes (LeeMac, TheSwamp, etc) permettant de générer un contour sur un jeu de sélection d'objets linéaires sécants (des images valent mieux que des mots donc voici une démonstration du programme de LeeMac). Les conditions à respecter pour que ce programme fonctionne c'est : - Les objets sont compatibles avec la commande "_BOUNDARY" (ou "CONTOUR") - Les objets se croisent donc sont coplanaires et possèdent des points d'intersections entre-eux J'avais déjà discuté de ce programme avec @didier mais je n'ai jamais vraiment eu le temps de me pencher plus en avant sur le sujet (le soucis, c'est que l'idée est toujours dans ma tête, d'où mon problème ^^). Le but étant d'avoir un principe similaire à une exception près parmi les conditions ci-dessus : les objets ne possèdent pas de points d'intersections entre-eux... Pour le contexte, je travaille dans un BE d'implantation de centrales photovoltaïques et donc on travaille constamment avec des modules et des structures qui sont espacés les uns des autres (les écarts ne sont pas fixes donc on ne peut pas fixer une valeur pour les recherches), cependant ces éléments sont très souvent regroupés via des zonages divers et variés (emprise PV, répartitions des puissances, types de modules, architecture élec', etc). Donc structurellement parlant, ces éléments sont distincts les uns des autres (pas de superposition ou autre) mais ils sont tous liés selon une propriété précise générant des zonages plus ou moins complexes. Le soucis, c'est que les itérations au sein d'un même projet sont nombreuses, donc ces zonages sont souvent modifiés et cela prend donc du temps. Mon idée est donc de pouvoir générer un contour à partir d'un jeu de sélection qui soit suffisamment précis pour englober l'ensembles des objets sélectionnés sans englober d'autres objets non concernés... Le programme devrait pouvoir fonctionner avec des objets linéaires (pour commencer disons simplement lignes et polylignes) puis s'étendre avec des blocs (mais si c'est possible de le faire avec des objets linéaires, cela ne posera pas de soucis de faire la même chose avec des blocs puisqu'il suffira de générer un contour précis au sein d'une définition de bloc pour ensuite utiliser ce contour dans la génération du contour en EO). Pour donner un exemple, je joins un fichier .dwg afin d'illustrer la chose. Dans ma logique, j'avais pensé à une analyse longue et fastidieuse qui s'apparente à la technique du drap. Le but étant de générer un contour global du jeu de sélection (par exemple (LM:ssboundingbox) qui permet de s'assurer que l'ensemble des objets sont présent dans ce rectangle). On définit un point M tel que M appartient à la polyline ABCD (fermée) et aux droites Dh et Dv, avec ABCD le contour du jeu de sélection, Dh la droite horizontale passant par M et Dv la droite verticale passant par M (selon la position du point M sur ABCD). Les droites Dh et Dv vont générer des points d'intersection avec les objets présents dans la surface ABCD, que l'on nommera M' tels que M' soit la projection horizontale ou verticale du point M sur les objets composants le jeu de sélection initial. On obtient donc une liste de points d'intersection pour chaque point M dont on peut récupérer facilement la borne inférieure et la borne supérieure donc on a pour tout points M, une liste de 2 points correspondant à la borne inférieure et supérieure (ou 1 point si la borne inférieure et supérieure sont confondue). En affectant un pas pour générer une liste de point M, on obtient tout un ensemble de couples de points correspondant à l'emprise réelle des objets (sous forme de dessin la forme est proche du zonage attendu, mais sous forme de liste, les points ne sont pas ordonnés correctement, à moins de ne choisir uniquement le point d'intersection le plus proche du point M (car (vl-sort M'-list '(lambda (e1 e2) (< (distance M e1) (distance M e2))))) mais auquel cas il faudra parcourir 100% du périmètre de la boundingbox, et non 50%). Si on affecte un lien entre le point et l'objet issu de cette intersection, il suffira ensuite de récupérer pour chaque projection le sommet réel des objets "coupés" le plus proche de la projection pour limiter le nombre d'objets (et limiter également un contour trop serré) et également éliminer les sommets situés à une distance beaucoup trop importante par rapport à ses voisins (cf. fichier .dwg). Je me rends compte que j'ai de vrais problèmes de concision dans mes explications moi...Donc pour ceux qui ont compris, j'aimerais savoir comment peut-on aborder un problème comme celui-ci sans avoir besoin de calculer les points d'intersection projetés de 2 milliard de points pour simplement générer un contour précis à un jeu de sélection...Car même si sur le papier, la technique du drap fonctionne, cela demande beaucoup de ressources et de temps, ce qui n'est pas le but non plus ! >n< Donc je me dis qu'il existe probablement un théorème mathématique ou une logique permettant de gagner du temps sur les calculs, mais pour un sujet comme celui-ci, ma logique propre ne me permet pas de réfléchir autrement qu'en analytique... Bref, merci pour les âmes charitables qui prendront non seulement le temps de me lire, mais également de me répondre ! (voyez chat comme...un challenge, sauf que je n'ai pas de solution toute faite :3) Bisous, Luna SSBoundingLine.dwg
  3. Salut, Je propose un challenge pour l'été (profiter des vacances pour apprendre ou se perfectionner en LISP). Tout le monde a entendu parler de la suite de Fibonacci. Une spirale de Fibonacci est une succession d'arcs de cercle de 90° connectés tangentiellement dont les rayons sont les termes de la suite de Fibonacci. Un exemple de spirale de Finonacci composée de 7 arcs : Challenge Il s'agit d'écrire une routine qui prend en argument le point de départ de la spirale et le nombre d'arcs pour dessiner la spirale dans AutoCAD (plusieurs arcs ou une polyligne). La routine (ici nommée spiralFib) devra pouvoir être appelée depuis une commande LISP (ici nommée c:TEST) pour pouvoir être testée dans AutoCAD pour dessiner des spirales ayant au minimum 4 arcs. (defun c:test (/ p i) (and (setq p (getpoint "\nPoint de départ: ")) (setq i (getint "\nNombre d'arcs [4-32]: ")) (< 3 i) (spiralFib p i) ) (princ) ) Un screencast montrant un exemple. Variante On peut, sur le même principe faire une routine pour une "Spirale d'or".
  4. Bonjour à tous, jeunes et moins jeunes Bon visiblement c'est la réunion des moins jeunes, donc je répond à l'appel 😄 Oui vous vous doutez bien que l'intitulé du post CHALLENGE entre crochet à de suite éveillé ma curiosité et me fais sortir du bois... Je ne pense pas en ce qui concerne l'algorithme : On lit la chaîne caractère par caractère, dans le sens de lecture. Dès que le caractère est un chiffre (ou un moins (-) suivi d'un chiffre), on reconstitue le nombre à partir de caractère (ou de ces caractères) et des suivants tant que se sont des chiffres ou un point (unique). On stocke le nombre reconstitué. On reprend la lecture des caractères suivants. Effectivement à la lecture de l'énoncé, j'en suis de suite arrivé à la même conclusion, ce qui signifie que le challenge ne va porter que sur un exercice de style. Les bases étant posé, je savais déjà que je laisserai (gile) dégainer ses expressions régulières (il en est l'auteur), c'est une question d'étique personnelle pour un challenge. Voilà ceci étant fait je ne vais pas bouter mon plaisir à me dérouiller les doigts en proposant tout de même quelques lignes, sachant que l'exercice était plié et qu'il n'y aurait pas d'enjeu algorithmique, sachant également que pour des raisons de souplesses et de performance les codes proposé le seront principalement sur du traitement de liste, par contre pied j'ai tenté de proposer un traitement directement sur la chaine de caractère, en me basant sur un exemple relevé au hasard du file de discutions. Mon premier jet basé sur les expressions retourné par la fonction read pour éviter de lire caractère par caractère la chaine ce qui est couteux en lisp. (defun f (str) (cond ((null (setq r (read str))) nil) ((numberp r) (cons r (f (substr str (+ (strlen (vl-princ-to-string r)) 2))))) (T (f (substr str (+ (strlen (vl-princ-to-string r)) 2)))) ) ) Un test rapide: _$ (f "slt / 18 +36.0 &gg !") (18 36.0) Ok Puis un regard plus attentif me montre qu'il y a de la ponctuation dans l'exemple fourni, et d'expérience pour avoir déjà expérimenté cette voie je comprend de suite que les caractères '.() peuvent posé problème à la fonction read Problème facilement contournable sans alourdir le code en mettant en place une trappe pour gérer les exceptions au moyen de vl-catch-all-apply Deuxième jet: (defun f (str) (cond ((vl-catch-all-error-p (vl-catch-all-apply 'read (list str))) (f (substr str 2))) ((null (setq r (read str))) nil) ((numberp r) (cons r (f (substr str (+ (strlen (vl-princ-to-string r)) 2))))) (T (f (substr str (+ (strlen (vl-princ-to-string r)) 2)))) ) ) Un second test rapide: _$ (f "Long= 450.0 m . ) 37 ( à -5.0 m !") (450.0 37 -5.0) Puis une analyse plus attentive des différents exemples, me montre que des caractères peuvent être accolé aux nombres Ce qui implique faut complexifier les lignes de codes ou proposer une fonction auxiliaire afin de formater le texte en argument pour qu'il corresponde aux limitations du code proposé. Mais quitte à analyser la chaine autant la traiter dans le même temps et je décide de changer mon fusil d'épaule en travaillant avec des listes, les données sont plus facile à analyser et moins couteuses. Ma première intention travailler avec des appels croisées mais hélas (gile) est déjà passé par là... Qu'à cela ne tienne je passe par un accumulateur pour stoker les nombres sous forme de liste et les reconstituer à la remonté des appels de la fonction récursive simple Ma troisième proposition (defun extraireNombres (txt / foo) (defun foo (l acc) (cond ((null l) nil) ((or (< 47 (car l) 58) (and (= (car l) 45) (< 47 (cadr l) 58)) (and (= (car l) 46) acc) ) (foo (cdr l) (cons (car l) acc)) ) (acc (cons (read (vl-list->string (reverse acc))) (foo (cdr l) nil) ) ) (T (foo (cdr l) nil)) ) ) (foo (vl-string->list (strcat txt " ")) nil) ) Teste _$ (extraireNombres "Longueur = 25.4mm Largeur = 12.7mm Quantité = -42.") (25.4 12.7 -42.0) A+ Bruno
  5. Bonjour, je ne vais pas répondre ici car ma réflexion est celle des IA, qui n'est pas le sujet du challenge et je voudrais pas polluer ce fil, par contre pour ceux qui ont un intérêt pour les IA, merci de lire ma (longue) réponse ici. Elle est fortement connexe au challenge original.
  6. Salut, Je vais essayer de lancer un petit challenge de géométrie. Dans AutoCAD, pour dessiner un arc elliptique, on peut spécifier les angles de départ et de fin, mais il existe aussi une option 'Paramètres'. Extrait de l'aide : En programmation d'AutoCAD, on retrouve cette notion de paramètre pour tous les objets curviligne (vlax-curve-getParamAtPoint en LISP ou Curve.GetParamAtPoint avec.NET). On a coutume de dire qu'un petit dessin vaut mieux qu'un long discours : Le challenge, donc, serait de définir deux fonctions (peu importe le langage) : - AngleToParam : qui prend comme arguments une ellipse et un angle et qui renvoie le paramètre correspondant - ParamToAngle : qui prend comme arguments une ellipse et un paramètre et qui renvoie l'angle correspondant Exemples avec une ellipse de 10 100 unités de grand axe pour 60 unités de petit axe : - AngleToParam d'un angle de 30° doit retourner un paramètre de 43.90° - ParamToAngle d'un paramètre de 30° doit retourner un angle de 19.11° - AngleToParam d'un angle de 230° doit retourner un paramètre de 243.28° - ParamToAngle d'un paramètre de 230° doit retourner un angle de 215.57° Les exemples sont donnés en degrés, mais pour plus de simplicité et de cohérence avec les fonction natives fonctions utiliseront les radians.
  7. Bonjour à la communauté. Je suis tombé par hazard sur le codage Vigenère dans Wikipédia et j'ai tout de suite pensé à un petit chalenge pour les membres du Lisp/VLisp. Le but est simple, grace à une seule commande, coder ou décoder une chaine. Exemple : ;;Codage (setq ChaineACoder (Vigenere "C" Chaine$)) ;;Décodage (setq ChaineDecodee (Vigenere "D" Chaine$)) Je pense aux 255 caractères usuels (sauf les 32 premiers, qui ne sont pas réellement des caractères). Le résultat du codage pourra se faire avec une ou deux clefs. Amusez-vous bien, si vous le désirez... Bien à toi, la communauté. Denis...
  8. Salut, Vous connaissez certainement ou en tout cas vous avez déjà entendu parler de la suite de Fibonacci. Cette suite d'entier naturels commence par 0 et 1 et chaque terme étant égal à la somme des deux termes pécédents. Je propose un petit challenge qui consiste à définir une fonction qui retourne le Nième terme de la suite de Fibonnacci, N étant l'argument de la fonction. (fib 0) doit retourner 0 (fib 1) doit retourner 1 (fib 2) doit retourner 1 (fib 3) doit retourner 2 (fib 4) doit retourner 3 (fib 5) doit retourner 5 etc. (mapcar 'fib '(0 1 2 3 4 5 6 7 8 9)) doit retourner : (0 1 1 2 3 5 8 13 21 34) (fib 46) doit retourner 1836311903 (46 est le rang maximal accessible avec des entier signés sur 32 bits qui ne peuvent excéder 2147483647).
  9. Montrez nous vos talents en AutoLISP ! Votre programme, le plus court possible, doit dessiner ces cercles Fournissez nous le listing de votre programme AutoLISP. Gardez à l'esprit que l'art de la programmation, c'est la concision et l'élégance !
  10. En se basant sur cette image qui représente un labyrinthe avec une forme en "P", pensez-vous qu'il soit possible de dessiner le chemin de sortie en une ligne (ou plutôt polyligne) ? 🤔 Contrainte pour la représentation du labyrinthe : - pas de polyligne donc que des lignes et des arcs - un calque "Mur" pour les traits épais en noir et un calque "Cloison" pour les traits fins en gris Langage autorisé : - Lisp - mais VBA et autres sont les bienvenus 😉
  11. Comme promis, je donne ma version récursive "plus concise". C'est la même que la troisième proposition de @VDH-Bruno en un peu moins concise mais insensiblement plus "rapide" puisqu'elle fait un appel récursif de moins dans les cas d'un nombre ou d'un point suivi d'un chiffre et un peu plus robuste puisqu'elle contrôle aussi la présence d'un point dans nombre en cours de reconstitution. (defun extraireNombres (str / loop) (defun loop (lst dot acc) (cond ((and (null lst) (null acc)) nil) ((isDigit (car lst)) (loop (cdr lst) dot (cons (car lst) acc)) ) ((and (isHyphen (car lst)) (isDigit (cadr lst)) (null acc)) (loop (cddr lst) dot (cons (cadr lst) (cons (car lst) acc))) ) ((and (not dot) (isDot (car lst)) (isDigit (cadr lst)) acc) (loop (cddr lst) T (cons (cadr lst) (cons (car lst) acc))) ) (acc (cons (read (vl-list->string (reverse acc))) (loop (cdr lst) nil nil)) ) (T (loop (cdr lst) dot acc)) ) ) (loop (vl-string->list str) nil nil) ) La même fonction peut être écrite avec une boucle (while ...) et beaucoup de (setq ...). (defun extraireNombres (str / lst num dot nums) (setq lst (vl-string->list str)) (while lst (cond ((isDigit (car lst)) (setq num (cons (car lst) num) lst (cdr lst) ) ) ((and (isHyphen (car lst)) (isDigit (cadr lst)) (null num)) (setq num (cons (cadr lst) (cons (car lst) num)) lst (cddr lst) ) ) ((and (isDot (car lst)) (isDigit (cadr lst)) (not dot) num) (setq num (cons (cadr lst) (cons (car lst) num)) lst (cddr lst) dot T ) ) (num (setq nums (cons (read (vl-list->string (reverse num))) nums) num nil dot nil lst (cdr lst) ) ) (T (setq lst (cdr lst)) ) ) ) (if num (setq nums (cons (read (vl-list->string (reverse num))) nums)) ) (reverse nums) ) Concernant la prise en compte de certains caractères (comme la barre de fraction), j'aurais dû être plus clair en précisant "la liste des nombres entiers et réels". Ça peut faire l'objet d'un autre challenge ou d'un ajout à celui-ci... Sinon, désolé @Patrick Emin, mais je pense que mêler l'IA à ce sujet est une vraie pollution (au sens propre comme au figuré).
  12. Bonjour, @bonuscad Bonne fête!😄 @didier Je ne suis pas convaincu que se soit le challenge qui éveille l'intérêt des anciens du forum, mais plutôt le type de donnée à traiter qui intimide les moins expérimentés. Extraire des données d'une chaine de caractère avec un formatage qui n'est pas codifié de façon rigoureuse est de mon point de vue un problème bien complexe à traiter et donne du code bien fastidieux à écrire, si on ne maitrise pas comme @(gile) les expressions régulières qui sont de mon point de vu la panacée. Si la donnée est issue d'un tableur type Excel, nous avons un formatage parfait (libellés, nombres, unités ect...) très facilement interprétable pour un programme Si la donnée est issue d'un traitement de texte cela devient beaucoup plus compliqué à interprété, ex: 10.2 mètre cube, 10.2 m3, 10.2m3. Que doit on traiter? (12.2) ou (12.2 3). De même que considère t'on comme une valeur numérique une fraction doit elle être vu comme une valeur numérique exemple 1/3 doit donner 0.33333 ou 1 & 3 et les exemple et contre exemple peuvent être très nombreux. D'ailleurs pour illustrer le propos j'invite à tester la donnée suivante: " Volume 1/3 m3 tous les 10m²" avec la version de @(gile) et les expressions régulières... A+ Bruno
  13. Oui, j'ai rajouté les dépendances, pour que vous puissiez avoir le frisson de faire tourner une application préhistorique, un peu comme un émulateur de Donkey Kong... P_supp_elem montre ce que l'absence de visual lisp pouvait engendrer comme complications ... Enfin ça ne s'appelle pas participer au challenge, puisque le but est de le faire maintenant et avec élégance mais je me souvenais que cette séparation de nombres n'avait pas été qq chose de simple ... a+ Gégé
  14. Bonjour @(gile), bonjour @bonuscad Chouette le challenge, merci. Je n'ai pas réussi à faire sans l'aide du programme (de (gile)) str2lst, mais j'arrive finalement à ça : (extrairenombres "Il faut extraire les nombres de cette liste : Longueur = 456.789 mètres, la largeur est de 123.456 et il faut retirer -56.89 à la quantité qui est de 1234") va renvoyer (456.789 123.456 -56.89 1234.0) (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) (defun ExtraireNombres (cha) (mapcar '(lambda (x) (atof x)) (vl-remove "." (vl-remove "" (str2lst (vl-list->string (vl-string->list (vl-string-translate "ABCDEFGHIJKLMNOPQRSTUVWXYZ:=(),/?!;" " " (strcase cha) ) ) ) " " ) ) ) ) ) Je me suis un peu amélioré et je suis content d'avoir réussi. Bravo BonusCAD pour les imbrications que je n'arrive pas encore bien à intégrer, par exemple ça je ne comprends pas donc je ne suis pas capable de l'écrire : (eval (read (strcat "(setq rslt (list " (apply 'strcat (mapcar '(lambda (x) (if (not (listp x)) (chr x) " ")) l)) "))"))) Je veux bien une explication en français dans le texte Je me doute que (gile) va nous surprendre encore. EDIT : Correction du code par prise en compte de nouveaux caractères alpha Amicalement
  15. Bonsoir, Une récente discussion m'a inspiré une petite proposition de challenge qui doit pouvoir parler à tous le monde https://cadxp.com/topic/54760-pb-de-trigo/?tab=comments#comment-312380 En général pour résoudre des problèmes de résolution dans un triangle, j'ai pour habitude de me servir des triangles semblables pour travailler sur un triangle dont l’hypoténuse (rayon du cercle unitaire) vaut 1, de façon à trouver la relation la plus simplifié à programmer pour résoudre le système. Pour mémoire dans cette configuration il suffit de connaitre une seule donné pour en déduire les autres. Dans cet esprit je vous propose d'élaborer une fonction trigones qui peut prendre en arguments: l'angle / sinus / cosinus / sécante / cosécante / tangente / cotangente, j'ai volontairement limité les arguments on pourrait en ajouter. (trigones ang sinus cosinus sécante cosécante tangente cotangente) Dans l'appel de la fonction, on ne renseignerait qu'un argument les autres valant nil, et la fonction retournerait tous les autres cotés, et ce quelque soit l'argument renseigné. Ex: Appel de fonction en renseignant l'angle: _$ (trigones (/ pi 4) nil nil nil nil nil nil) (0.785398 0.707107 0.707107 1.41421 1.41421 1.0 1.0) Ex: Appel de fonction en renseignant le sinus: _$ (trigones nil 0.6 nil nil nil nil nil) (0.643501 0.6 0.8 1.25 1.66667 0.75 1.33333) Ex: Appel de fonction en renseignant la tangente: _$ (trigones nil nil nil nil nil 2 nil) (1.10715 0.894427 0.447214 2.23607 1.11803 2 0.5) Une petite illustration pour ceux dont la résolution des trigones est un lointain souvenir, on se limite a résoudre le triangle de rayon 1 dans le premier quadrant du cercle c'est à dire avec un angle compris entre 0 et PI/2 Un petit prétexte pour réviser sa trigo en cette fin d'année, bon code à tous.
  16. Hello Coucou j'esperais voir un Francais jouer ... https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/programming-challenge/td-p/10735297 La Sante, Bye, lecrabe
  17. Bonjour à tous, Dans un challenge précédent il a été rappelé au moyen d'une fonction groupBy l’intérêt de définir des fonctions générique, dans cette esprit (et en plus simple je pense) je propose ici d'écrire une fonction de coupure "générique" (très pratique après une fonction de tri) qui prendrait en argument une fonction prédicat appliqué à une liste: (coupure-if-not predicate-function liste) Pour tester _$ (coupure-if-not '= '(0 0 0 1 1 0 1 1 1 0 0 0 0 1)) ((0 0 0) (1 1) (0) (1 1 1) (0 0 0 0) (1)) _$ (coupure-if-not '(lambda (x y) (= x (1- y))) '(1 2 3 4 6 6 7 8 10 11)) ((1 2 3 4) (6) (6 7 8) (10 11)) Et/ou la fonction symétrique (normalement si on a l'une des deux il est aisé de faire l'autre) (coupure-if predicate-function liste) Pour tester _$ (coupure-if '= '(0 0 0 1 1 0 1 1 1 0 0 0 0 1)) ((0) (0) (0 1) (1 0 1) (1) (1 0) (0) (0) (0 1)) _$ (coupure-if '(lambda (x y) (= x (1- y))) '(1 2 3 4 6 6 7 8 10 11)) ((1) (2) (3) (4 6 6) (7) (8 10) (11)) Le but de ce challenge est de ce familiariser avec l'écriture/utilisation des fonctions dite "d'ordre supérieur", pour laisser tout à chacun le loisir de réfléchir au problème , je ne pense pas remettre ma copie avant Mardi soir ou Mercredi en journée. Pour ceux qui ont déjà cette fonction en magasin prière d'attendre les premières propositions ou tentative de propositions. (En cas de difficulté regarder du coté des fonctions vl-remove-if-not, vl-remove-if, vl-member-if-not, vl-member-if. (gile) en à déjà proposé des équivalences sur le forum, si je retrouve le lien je le posterai). Bon WE à tous
  18. Salut, En tombant sur cet article à propos d'un algorithme pour calculer l'enveloppe convexe d'une collection de points, je me suis dit que ça pourrait faire l'objet d'un nouveau challenge et que ça pourrait aussi être une base pour résoudre un problème plus complex posé par @Luna dans ce sujet : faire une enveloppe concave (concave hull). Donc, il s'agit toujours d'écrire un fonction (dans le langage de son choix) qui prend en argument une liste de points et qui renvoie la liste des points qui constituent l'enveloppe convexe (convex hull) des points passés en argument. Il existe au moins un autre algorithme bien connu pour extraire l'enveloppe convexe d'une collection de points, mais comme il a déjà été souvent implémenté, je trouve plus intéressant de se pencher sur celui-là et je suppute qu'il se prête mieux à la généralisation vers une enveloppe concave (mais c'est une autre histoire...). On doit pouvoir tester la fonction 'quickhull' via une sélection d'entités points (nodal) en dessinant une polyligne. Exemple en LISP : (defun c:test (/ ss i pts) (if (setq ss (ssget '((0 . "point")))) (progn (repeat (setq i (sslength ss)) (setq pts (cons (cdr (assoc 10 (entget (ssname ss (setq i (1- i)))))) pts ) ) ) (command "_pline") (foreach p (quickhull pts) (command "_non" p) ) (command "_close") ) ) (princ) )
  19. Coucou, Un exercice sans difficulté de programmation en tant que tel, mais le but étant de réfléchir "autrement". On a tous eu besoin à un moment donné eu besoin de récupérer la liste des sommets d'une polyligne et pour ce faire, on a chacun(e) sa méthode :3 Cependant je me suis bien souvent demandé, existe-t-il une solution plus rapide ? Pour simplifier le challenge, l'exercice se porte uniquement sur les LWPOLYLINE, car les SPLINE, LINE, POLYLINE, ARC, etc ne possède pas les mêmes approches de programmation selon les objets. On peut prendre n'importe quel langage (en revanche je ne sais pas s'il existe un moyen d'utiliser un BenchMark sur plusieurs type de langage différent...?) histoire de comparer également les simplicités d'écriture selon les langages. La liste retournée doit contenir l'ensemble des sommets de la polyligne, dans le sens de lecture de la polyligne (donc le sommet de départ au début, le dernier à la fin) et le but étant de trouver une version qui permet d'aller suffisamment vite en fonction du nombre de sommets. J'ai généré sur le fichier ci-joint 4 polylignes ayant respectivement 10, 100, 1 000 et 10 000 sommets qui serviront de base (pour que tout le monde est la même). Le nombre de lignes importe peu, la vitesse d'exécution servira de comparaison. Concernant le Benchmark, j'utilise le BenchMark de Michael Puckett mais si vous en avez un autre, dite le histoire de maximiser les points communs pour la comparaison. Pour le temps de réponse, disons que je posterais mes versions ce we mais il n'y a pas de limite de temps 😜 Bisous, Luna get-pt-list.dwg BenchMark (Michael Puckett).lsp
  20. Bonjour, Je viens de me souvenir d'un challenge perso qui m'avais bien tordu l'esprit. Convertir un texte pour injection d'URL. (ou requete HTML). Lorsque nous tapons une adresse internet dans la barre d'adresse d'un navigateur, c'est une injection. Exemple simple "https://www.openstreetmap.org/#map=16/48.4674/-2.5486" Ici nous arrivons directement au coordonnées injectées. Mais lorsque nous utilisons une URL en programmation, nous utilisons pas la barre du navigateur, cela va directement au serveur. Si l'injection contient des caractères spéciaux il faut les convertir en Caractères hexadécimales. Exemple "https://fr.wikipedia.org/wiki/Saint-Barthélemy-d'Anjou" doit devenir "https://fr.wikipedia.org/wiki/Saint-Barth%C3%A9lemy-d'Anjou" ou "aB 09_éùl'o @£" -> "aB%2009_%C3%A9%C3%B9l'o%20%40%C2%A3" Il existe des fonctions ou méthodes dans beaucoup de langage qui s'occupe très bien de cela, mais pas en Autolisp. Je me permet donc de vous proposer d'écrire l'équivalent de ces 2 fonctions Javascript encodeURIComponent decodeURIComponent Évidement sans énumération telle que '(("é" . "%C3%A9") ...) Je poste mes fonctions Dimanche soir. bonne exploration et à bientôt.
  21. Salut, Un nouveau challenge (tout langage accepté). L'objectif est de définir une fonction pour grouper les points (coordonnées) d'une liste en fonction de leur coordonnée X avec une tolérance de 10 unités. La fonction devra prendre comme argument une liste de points 2d (x y) ou 3d (x y z) et renvoyer les points groupés sous la forme que permet le langage utilisé (en LISP ce sera forcément une liste de sous-listes, avec d'autre langages, ça peut-être une autre structure de données : un tableau déchiqueté, un dictionnaire, ...). Exemple, avec la liste suivante en entrée : (setq pts '((14.4 4.7) (4.8 0.7) (8.0 0.9) (9.3 4.7) (-14.3 14.3) (-6.3 14.2) (-13.6 7.5) (-1.9 -3.2) (2.4 -4.9) (6.6 11.2) (-6.6 4.7) ) ) on devrait obtenir 3 groupes : ((-6.6 4.7) (-13.6 7.5) (-6.3 14.2) (-14.3 14.3)) ((2.4 -4.9) (-1.9 -3.2) (4.8 0.7)) ((6.6 11.2) (9.3 4.7) (8.0 0.9) (14.4 4.7)) On pourra ensuite pousser un peu plus loin pour rendre la fonction plus générique en passant la tolérance en argument, puis en groupant par X et Y.
  22. Saut à la communauté. Je pense que vous savez déjà de quoi je vais parler. Faites un programme, quel qu'il soit, mais comment les protéger... En gros, on vous paye pour dessiner, mais vous programmez, mais sur votre bulletin de paie est écrit "Dessinateur". La législation française est très explicite là-dessus... Vous êtes dessinateur (c'est sur votre bulletin de paye) et non programmeur/développeur ? Donc, tous ce que vous développez/programmez est en votre entière possession et sauf votre accord, votre employeur ne DOIT pas les utiliser sans votre accord, avant (?), pendant (Ok), et après (c'est là, l'arnaque)... Mais, comment protéger vos développement, vos logiciels, pour les quelles vous n'avez pas été embauché, mais jamais payé... Attention, on parle bien d'un jeu... Attention, je ne suis pas contre le patronat... Je veux juste protéger les développements qui se font exploités... Et aussi, protéger les développements de programmateurs qui aimeraient vendre un peu leur travail, ou les monnayer... Je vous propose donc un nouveau Chalenge... Comment faire un programme "entier" (qui sera utilisable partout et en dehors de toutes contraintes) et le protéger... Donc, je vous propose un défit pour protéger un lisp ou autre. Voici les condition (et je reste ouvert aux remarques) : Comment faire un .lsp (ou autre, mais la principale demande reste pour AutoCAD, mais je ne suis pas fermé) et le protéger (.ini, base de registre, fichier caché, suite de code ASCII, clef différentielle, encodée...) Premièrement, comment protéger son travail : 1.soit dans le temps (un mois d'utilisation accordé, par exemple) 2.soit dans le nombre d'utilisation ( 10, 20, 200) 3.soit autre chose dont je n'ai pas connaissance, mais je reste ouvert... Et comment le distribuer : 1.Un Bundle 2.Un fichier compiler (qui contiendrait tous les programmes) 3.Être aider d'un autre logiciel de distribution, gratuit s'il vous plait... Car le but est de protégé le petit développeur qui s'est ruiner pour son bosse et qui repart avec rien... Donc, Tout doit être gratuit... je vous propose un petit développement de mon cru, comment le rendriez-vous inviolable et protégé, car là est la question, ce programme dessine une crois dans un quadrilatère (Oui, certain me dirait, Wouaouw, quel effort... je sais, mais je n'est pas le problème), mais comment le vendre (pas important) mais comment le protéger (tu l'utilises, tu me dois 10 euros (toutes les 10, 20, 100 utilisations, tous les mois, une "licence ad-vitam"...) Et là, vous avez toutes les libertés) : Je suis désolé, c'est du Lisp, mais vous faites comme vous le voulez, le seul impératif, c'est que c'est pour AutoCAD (ou ZWCAD, Draftsight...) Libre à vous : (vl-load-com) ;;; ***************************************** ;;; Dessine une croix dans un quadrilatère ;;; ***************************************** (defun c:CroixDsQuadri (/ ent ent-liste n liste-sommets) (princ "\n\tDéveloppé par Denis H. (1.0)") (setq doc (vla-get-activedocument (vlax-get-acad-object))) (vla-startundomark doc) (if (eval 'CleRegCerene) (CleRegCerene "DenisH") ) ;_ Fin de if (while (= "LWPOLYLINE" (cdr (assoc 0 (entget (setq ent (car (entsel "\nChoix de la polyligne\n"))))))) (setvar "clayer" (cdr (assoc 8 (entget ent)))) (setq ent-liste (entget ent) n 0 ent 0 liste-sommets nil ) ;_ Fin de setq (repeat (length ent-liste) (if (= 10 (car (nth n ent-liste))) (setq liste-sommets (cons (cdr (nth n ent-liste)) liste-sommets)) ) ;_ Fin de if (setq n (+ 1 n)) ) ;_ Fin de repeat (setq liste-sommets (reverse liste-sommets)) (command "_.line" (nth 0 Liste-sommets) (nth 2 Liste-sommets) "") (command "_.line" (nth 1 Liste-sommets) (nth 3 Liste-sommets) "") ) ;_ Fin de while (vla-endundomark doc) (princ) ) ;_ Fin de defun
  23. Salut à tous. Je propose un petit jeu, mais en Lisp et/ou en VLisp et sans mélanger les deux. Mais si vous êtes en mesure de proposer d'autres langages, libre à vous, faites-nous voir vos connaissances... ;) Avec le moins de lignes possible, faire ceci : 1.La base est une chaine contenant un nombre à 16 chiffres (ex : "5637159071856346"), 2.Passer par l'étape d'inversion de ce contenu (ex : "6436581709517365"), en fait il faut lire la chaine depuis la fin, 3.Puis, permuter les paires 2 à 2 (ex : "46638571901537765"), on inverse les chiffres 2 par 2, 64 devient 46, 36 devient 63... C'est parti... ;) Denis...
  24. Comme l'énoncé n'est pas très clair, j'ai essayé de faire quelque chose de générique en ajoutant comme argument la liste des caractères à chiffrer. La fonction de base : ;;; vigenere ;;; Fonction générique de chiffrement/déchiffrement ;;; Utilise le chiffre de Vigenère avec l'alphabet spécifié ;;; ;;; Arguments ;;; op : opération à effectuer (+ pour le chiffrement, - pour le déchiffrement) ;;; chars : alphabet utilisé (liste de codes ascii des caractères à chiffrer) ;;; str : chaîne à chiffrer ;;; key : clé de chiffrement (defun vigenere (op chars str key / ks lks lcs i) (setq ks (mapcar '(lambda (c) (vl-position c chars)) (vl-string->list key) ) lks (length ks) lcs (length chars) i 0 ) (vl-list->string (mapcar '(lambda (c / n m) (cond ((null (setq n (vl-position c chars))) c) ((null (setq m (nth i ks))) c) (T (setq i (rem (1+ i) lks)) (nth (rem (+ lcs (op n m)) lcs) chars) ) ) ) (vl-string->list str) ) ) ) On peut utiliser cette fonction pour définir deux fonctions génériques, une pour le chiffrement, l'autre pour le déchiffrement. ;;; Fonction générique de chiffrement (defun encrypt (chars str key) (vigenere + chars str key)) ;;; Fonction générique de déchiffrement (defun decrypt (chars str key) (vigenere - chars str key)) Puis utiliser ces fonctions pour définir différentes fonctions suivant les caractères à chiffrer. Pour chiffrer uniquement les lettres majuscules non accentuées (comme dans l'exemple de Wikipedia) (defun encryptUppers (str key) (encrypt (vl-string->list "ABCDEFGHIJKLMNOPQRSTUVWXYZ") str key) ) (defun decryptUppers (str key) (decrypt (vl-string->list "ABCDEFGHIJKLMNOPQRSTUVWXYZ") str key) ) _$ (encryptUppers "J'ADORE ECOUTER LA RADIO TOUTE LA JOURNEE" "MUSIQUE") "V'UVWHY IOIMBUL PM LSLYI XAOLM BU NAOJVUY" _$ (decryptUppers "V'UVWHY IOIMBUL PM LSLYI XAOLM BU NAOJVUY" "MUSIQUE") "J'ADORE ECOUTER LA RADIO TOUTE LA JOURNEE" Pour chiffrer toutes les lettres utilisées en français (y compris les lettre accentuées et les liaisons) (defun encryptLetters (str key) (encrypt (vl-string->list "ABCDEFGHIJKLMNOPQRSTUVWXYZÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸÆŒabcdefghijklmnopqrstuvwxyzàâäçéèêëîïôöùûüÿæœ" ) str key ) ) (defun decryptLetters (str key) (decrypt (vl-string->list "ABCDEFGHIJKLMNOPQRSTUVWXYZÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸÆŒabcdefghijklmnopqrstuvwxyzàâäçéèêëîïôöùûüÿæœ" ) str key ) ) _$ (encryptLetters "[Challenge] Petite idée pour un codage/décodage Vigenère" "CADxp") "[EhdÎÀgnjÂ] égtlÆT kdë Équu ŒÄ eogXVg/dëZÇfaj ôkghÔcte" _$ (decryptLetters "[EhdÎÀgnjÂ] égtlÆT kdë Équu ŒÄ eogXVg/dëZÇfaj ôkghÔcte" "CADxp") "[Challenge] Petite idée pour un codage/décodage Vigenère" Pour chiffrer tous les caractères de 32 à 255*. On utilise une fonction pour générer une plage de nombres entiers. ;;; range ;;; Génère une plage de nombres entiers (liste) ;;; ;;; Arguments ;;; from : début de la plage ;;; to : fin de la plage (defun range (from to) (cond ((= from to) (list to)) ((< from to) (cons from (range (1+ from) to))) ((< to from) (cons from (range (1- from) to))) ) ) ;;; Fonctions de chiffrement/déchiffrement des caractères 32 à 255 ;;; ;;; Arguments ;;; str : chaîne à chiffrer ;;; key : clé de chiffrement (defun encryptChars (str key) (encrypt (range 32 255) str key) ) (defun decryptChars (str key) (decrypt (range 32 255) str key) ) _$ (setq crypted (encryptChars "[Challenge] Petite idée pour un codage/décodage Vigenère" "F#4fun")) "F|§Áº‹q{«²nvhˆ¯É³FlxOºn–r‰¸uÔ#wµ¹¯hCª^±•gu­ºn|l{«ÃV˜h" _$ (decryptChars crypted "F#4fun") "[Challenge] Petite idée pour un codage/décodage Vigenère" * Cette séquence de caractères contient des caractères de contrôle non imprimables.
  25. Bonjour, Un petit challenge. Voici une solution qui en traite 13004. On peut ajouter des positions relatives dans la liste aux milieux du code. (vl-load-com) ; txt2z, Eleve un bloc selon le texte situé à une position relative au bloc. ; Le dessin ne doit contenir que les textes et les blocs concernés. (defun c:txt2Z ( / acobj acdc model ltext pt ld ind pos z cpt d pr) (prompt "\n Traitement en cours ...") (setq acobj (vlax-get-acad-object) acdc (vla-get-activedocument acobj) model (vla-get-modelspace acdc) ltext '() cpt 0) ; Création de la liste d'association ltext '((position_relative . z) ...) (vlax-for obj model (if (= (vla-get-ObjectName obj) "AcDbText") (setq pos (vlax-safearray->list (vlax-variant-value (vla-get-InsertionPoint obj))) ltext (append ltext (list (cons (strcat (rtos (car pos)) "," (rtos (cadr pos))); Position plus pratique en texte. (vla-get-textstring obj))))); Z ) ) ; Pour chaque bloc on cherche si il a une association avec la liste ltext. (vlax-for obj model (if (= (vla-get-ObjectName obj) "AcDbBlockReference") (progn (setq pt (vlax-safearray->list (vlax-variant-value (vla-get-InsertionPoint obj))) ; Liste des positions observées. ld '((0.5 0.15) (0.501 0.15) (0.5 0.151) (0.501 0.151) (0.499 0.15) (0.5 0.149) (0.499 0.149) (0.497 0.101) (0.496 0.105) ) ind 0 z nil) ; Tant qu'une position ne soit trouvée ou aucune. (while (not z) (setq d (nth ind ld) pr (strcat (rtos (+ (car pt) (car d))) "," (rtos (+ (cadr pt) (cadr d))))) (if (setq z (cdr (assoc pr ltext))) (progn ; Elévation du bloc (vla-put-InsertionPoint obj (vlax-3d-point (list (car pt) (cadr pt) (atof z)))) ; Suppression de la position dans la liste. (vl-remove pr ltext) (setq cpt (1+ cpt)) ) ) (setq ind (1+ ind)) (if (= ind (length ld)) (setq z T)) ) ) ) ) (princ (strcat "\n Nombre de blocs traités -> " (itoa cpt))) ) Taper txt2z attendre un peux ...
×
×
  • 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é