Patrick_35 Posté(e) le 28 avril 2010 Posté(e) le 28 avril 2010 Bonjour Une idée de challengeDéterminer si un nombre est dans une plage (in 45 "44-50,55sfs-66,100,800") --> T(in 52 "44-50,55sfs-66,100,800") --> nil(in 50.2 "44-50.5,55sfs-66,100,800") --> T(in 50.6 "44-50.5,55sfs-66,100,800") --> nil(in "58" "44-50.5,55sfs-66,100,800") --> T(in "67.5" "44-50.5,55sfs-66,100,800") --> nil A vos neurones ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 28 avril 2010 Posté(e) le 28 avril 2010 A vos neurones ;) Déjà pour comprendre l'énoncé... Peux-tu être un peu plus explicite, s'il te plait. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 28 avril 2010 Auteur Posté(e) le 28 avril 2010 heu, oui Déjà pour comprendre l'énoncé...Il faut bien commencer par quelque chose ;) Peux-tu être un peu plus explicite, s'il te plait.Dans l'exemple donné, tu as comme 1er argument le nombre recherchéPour le 2em je reprends le même principe qu'une sélection d'impression de pagesTu as donc comme critères :44-50, ce qui veut dire de 44 à 50, 44 et 50 inclusun séparateur (virgule, espace, point-virgule ou autres)55sfs-66, ce qui veut dire de 55 à 66, 55 et 66 inclus en enlevant les fautes de frappes sfsun séparateurle nombre 100etc... En espérant être plus clair @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 28 avril 2010 Posté(e) le 28 avril 2010 OK, c'est bien ce qu'il m'avait semblé comprendre.J'ai une réponse, mais je vais attendre un peu... ;) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 28 avril 2010 Auteur Posté(e) le 28 avril 2010 OK, c'est bien ce qu'il m'avait semblé comprendre.J'ai une réponse, mais je vais attendre un peu... ;) Le contraire m'aurai étonné. :cool: @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Tramber Posté(e) le 28 avril 2010 Posté(e) le 28 avril 2010 55sfs-66, ce qui veut dire de 55 à 66, 55 et 66 inclus en enlevant les fautes de frappes sfs J'avais tout compris sauf ça ! Mais le "pattern" obéit toujours aux mêmes règles ou peut être quelconque ? (in 45 "44-50,100,800"), par exemple.Est possible et demandé ou pas ?(in 45 "32,12,122,1235,100,800") par exemple encore. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
zebulon_ Posté(e) le 28 avril 2010 Posté(e) le 28 avril 2010 Bonjour, On ne parle que de nombres entiers ?Le premier argument peut être soit un entier, soit un texte ? Pour "corriger" les fautes de frappe, je verrais bien la fonction atoi.(atoi "55sfs") -> 55Il y a juste le cas où la faute de frappe est très lourde et que le texte ne commence pas par un chiffre. Dans ce cas atoi renvoi 0(atoi "sfs55") -> 0(atoi "coucou") ->0 AmicalementVincent Finalement, non. Atoi ne peut pas convenir puisque dans les exemples il y a des réels, mais je n'avais pas bien regardé. [Edité le 28/4/2010 par zebulon_] 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)
zebulon_ Posté(e) le 28 avril 2010 Posté(e) le 28 avril 2010 j'ai un petit problème de syntaxe. Comment ça se passe quand il y a des nombres négatifs ? Le (-) moins et le (-) tiret vont être difficiles à discerner. Je propose d'utiliser ":" comme dans les plages excel. (in -47 "-50:-44,55sfs:66,100,800") Si tu es d'accord. 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)
Patrick_35 Posté(e) le 28 avril 2010 Auteur Posté(e) le 28 avril 2010 TramberLe "pattern" peut être quelconqueTes deux exemples sont valable zebulon_Les nombres peuvent aussi être des réelsPour les fautes de frappe, si ce n'est pas un chiffre, on l'ignore tout simplement(in 0 "0,32,12,122,1235,100,800") --> T(in 0 "sd0df,32,12,122,1235,100,800") --> T(in 0 "df,32,12,122,1235,100,800") --> nil Je propose d'utiliser ":" comme dans les plages excel.(in -47 "-50:-44,10:40,55sfs:66,100,800")C'est juste, je n'y avais pas pensé. OK (in 40 "-50:-44,40:50,55sfs:66,100,800") --> T(in -40 "-50:-44,40:50,55sfs:66,100,800") --> nil @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
zebulon_ Posté(e) le 28 avril 2010 Posté(e) le 28 avril 2010 (vl-load-com) (defun numonly (txt / RES SIGN) ;; supprimer tous les caractères autres que des nombres, "." "+" et "-" (setq RES (vl-list->string (vl-remove-if-not '(lambda (x) (member x '(43 45 46 48 49 50 51 52 53 54 55 56 57)) ) (vl-string->list txt) ) ) ) ;; déterminer le signe (if (= (substr RES 1 1) "-") (setq SIGN "-" RES (substr RES 2) ) (setq SIGN "") ) ;; supprimer tous les "+" et "-" (setq RES (vl-list->string (vl-remove-if '(lambda (x) (member x '(43 45)) ) (vl-string->list RES) ) ) ) (strcat SIGN RES) ) (defun borne (ELEM / POS BI BS) (if (setq POS (vl-string-position 58 ELEM)) (setq BI (distof (numonly (substr ELEM 1 POS)) 2) BS (distof (numonly (substr ELEM (+ POS 2))) 2) ) (setq BI (distof (numonly ELEM) 2) BS (distof (numonly ELEM) 2) ) ) (if (and BI BS) (list BI BS) ) ) (defun in (NB PLAGE / LELEM POS ELEM PLAGE) (if (= (type NB) 'STR) (setq NB (distof (numonly NB))) ) (while (setq POS (vl-string-position 44 PLAGE)) (if (setq ELEM (borne (substr PLAGE 1 POS))) (setq LELEM (cons ELEM LELEM)) ) (setq PLAGE (substr PLAGE (+ POS 2))) ) (if (setq ELEM (borne PLAGE)) (setq LELEM (cons ELEM LELEM)) ) (setq LELEM (reverse LELEM)) (print NB) (print LELEM) (apply 'or (mapcar '(lambda (x) (and (<= (car x) NB) (>= (cadr x) NB) ) ) LELEM ) ) ) (defun c:plage () (in "-50abc" "-55:-45,sfs:66,100,800,df") ) un premier jet 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)
didier Posté(e) le 28 avril 2010 Posté(e) le 28 avril 2010 coucou je suis frustré au dernier degré je regarde souvent passer les "challenge"mais si je ne réponds pas, ce n'est pas que je soit une bille en Lispje n'ai rien à prouver à personne, par ailleurs... mais c'est simplement parce que je ne comprends JAMAISau grand JAMAIS les énoncés suis-je le seul dans ce cas ? le dernier ne déroge pas à la règle, amicalement désolé Éternel débutant... Mon site perso : Programmer dans AutoCAD
zebulon_ Posté(e) le 29 avril 2010 Posté(e) le 29 avril 2010 mais c'est simplement parce que je ne comprends JAMAISau grand JAMAIS les énoncés il est vrai que l'énoncé était un peu succin, d'où les différentes questions et réponses qui sont tombées dans la foulée. J'aime bien ces challenges parce que, quand j'essaye d'y répondre, il me faut trois pages de code et d'autres, qui se reconnaitront, font preuve d'une concision exemplaire. Ma frustration est là ;) Dans le code que je donne plus haut, il y a une erreur de logique dans la fonction (numonly ...). D'abord je conserve les caractères "+" pour les supprimer par la suite. Autant les supprimer tout de suite, j'y gagnerai en concision. 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)
Tramber Posté(e) le 29 avril 2010 Posté(e) le 29 avril 2010 J'aimerais le faire moi aussi.Je préfère ne pas me lancer car j'ai beaucoup de boulot et d'occupations jusqu'à dimanche inclu !Le temps de faire un ou deux post, ok, mais créer une belle routine bien conscise m'exiterait si je pouvais me concentrer. Téléphone !Qu'est-ce que je disais ?! On verra bien, à + Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Patrick_35 Posté(e) le 29 avril 2010 Auteur Posté(e) le 29 avril 2010 Zebulon_ Sympa le lisp. Tu utilises une liste par paire. Bien vuJ'ai fais autrement en utilisant au max la lecture par caractère (defun in(nb str / lst pos txt val val2 valid) (and (eq (type nb) 'STR) (setq nb (read nb)) ) (setq pos 1) (while (/= (setq val (substr str pos 1)) "") (cond ((eq val ":") (if txt (setq lst (cons "to" (cons (read txt) lst))) (setq lst (cons "to" lst)) ) (setq txt nil) ) ((member val '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "." "-")) (if txt (setq txt (strcat txt val)) (setq txt val) ) ) (T (and txt (setq lst (cons (read txt) lst))) (setq txt nil) ) ) (setq pos (1+ pos)) ) (setq lst (reverse (vl-remove '- (if txt (cons (read txt) lst) lst))) pos 0 ) (if (member nb lst) (setq valid T) (while (setq val (nth pos lst)) (and (eq (nth (1+ pos) lst) "to") (setq val2 (nth (+ 2 pos) lst)) (< val nb) (> val2 nb) (setq valid T pos (length lst) ) ) (setq pos (1+ pos)) ) ) valid ) TramberIl est pas toujours facile de répondre à un challenge, mais c'est oh combien stimulant.Par contre, dès qu'il y a de la 3D, je suis largué DidierSi tu es frustré au dernier degré, ça va, il y a encore de la marge vers le 1er ;)C'est juste une "frustratonnette" :DIl est vrai que j'ai été peu prolixe sur le 1er message, mais on m'a vite fait corriger le tir.Mais cela n'empêche pas de te lancer, même si tu as rien à prouver @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 29 avril 2010 Posté(e) le 29 avril 2010 Salut, J'étais en déplacement, ça a permis à certains de répondre.Je donne les réponses que j'avais faites hier (le cachet du post faisant foi ;) ) Les deux réponses utilisent la routine str2lst (une de celles que j'utilise le plus) méthode 'while'(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 in (n l / x r) (setq l (str2lst l ",")) (or (numberp n) (setq n (atof n))) (while (and (not r) l) (setq x (mapcar 'atof (str2lst (car l) ":")) l (cdr l) ) (if (or (= (car x) n) ( (setq r T) ) ) r ) méthode 'vl-some'(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 in (n l) (or (numberp n) (setq n (atof n))) (vl-some '(lambda (x) (or (= (car x) n) ( (mapcar '(lambda (x) (mapcar 'atof (str2lst x ":"))) (str2lst l ",") ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 30 avril 2010 Auteur Posté(e) le 30 avril 2010 Chapeau (gile) Je ne connaissais pas (<= (car x) n (cadr x))Tu as réduit deux conditions en une seul :D Par contre,avec vl-some, une boucle supplémentaire A la lecture de ton lisp, j'en conclus qu'il est plus efficace de travailler avec des listes qu'avec des caractères.J'en avais l'intuition, maintenant, j'en ai la confirmation. je me suis amusé à rependre ton idée de routine str2lst pour en faire une en itérative (defun str3lst (str sep / lst pos) (while (setq pos (vl-string-search sep str)) (setq lst (cons (substr str 1 pos) lst) str (substr str (+ (strlen sep) pos 1)) ) ) (reverse (cons str lst)) ) Je donne les réponses que j'avais faites hier (le cachet du post ;) faisant foi )Le malin, dans le forum test :cool: On n'a jamais douté de toi ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Tramber Posté(e) le 1 mai 2010 Posté(e) le 1 mai 2010 str2lst est ce que j'ai cherché à faire vendredi. Je ne l'ai pas ici mais mon but était de traiter en récursif et j'y étais arrivé en utilisant Vl-position et substr le résultat était moins concis. Moins classe ! Le reste, je n'ai pas regardé, je snobe les problèmes de liste. Mais j'ai souvent à faire avec les listes en string séparées par des virgules vers des liste Autolisp et inversement. J'ai donc intégré des routines depuis longtemps mais elle datent d'une époque où je connaissais à peine le VLisp. (du coup j'ai pas osé les montrer). Depuis l'autre jour : beuaoucp de boulot, du temps pour ma copine et toute la journée à remettre en état des deudeuches pour une expo + un copain qui monte son local traiteur et qui a fait plein de conneries, faute de plans, comme d'hab !Au secours Tramber ! Challenge 32 : encore perdu ! Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
didier Posté(e) le 2 mai 2010 Posté(e) le 2 mai 2010 coucou quand je parle de frustration, c'est une vue de l'esprit car je ne connais pas ces affres,mais par contre, au risque assumé de me choper la honte,je n'ai toujours pas compris ce qu'il fallait faire ... je ne mets pas en cause la clarté des énoncés, puisque les autres répodent c'est que c'est compréhensible par des humainsnon c'est moi qui suis hermétique, point final ou pas humain... désolé Éternel débutant... Mon site perso : Programmer dans AutoCAD
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