couples-entiers.lisp (4155B)
1 #| 2 Auteur : John CHARRON 3 email : charron.john@gmail.com 4 |# 5 6 ;; définition des variables globales (toujours entre astérisques) 7 (defvar *current* (list 0 0 0)) ;; liste courante (clé x y) 8 (setf *current* (list 0 0 0)) 9 (defvar *db* nil) ;; base de données qui stocke tous les "(clé x y)" 10 (setf *db* nil) 11 (push *current* *db*) 12 13 (defvar *max-x* 0) ;; valeur maximale de x jusque atteinte 14 (setf *max-x* 0) 15 (defvar *max-y* 0) ;; valeur maximale de y jusque atteinte 16 (setf *max-y* 0) 17 (defvar *min-x* 0) ;; valeur minimale de x atteinte 18 (setf *min-x* 0) 19 (defvar *min-y* 0) ;; valeur minimale de y atteinte 20 (setf *min-y* 0) 21 22 #| pour remettre toutes les variables globales à leur valeurs par défaut 23 afin de tester, de refaire un 'zig-zag', etc. 24 |# 25 (defun reset () 26 (progn 27 (defvar *current* (list 0 0 0)) ;; liste courante (clé x y) 28 (setf *current* (list 0 0 0)) 29 (defvar *db* nil) ;; base de données qui stocke tous les "(clé x y)" 30 (setf *db* nil) 31 (push *current* *db*) 32 (defvar *max-x* 0) ;; valeur maximal de x jusque "là" 33 (setf *max-x* 0) 34 (defvar *max-y* 0) ;; valeur maximal de y jusque "là" 35 (setf *max-y* 0) 36 (defvar *min-x* 0) ;; valeur minimale de x atteinte 37 (setf *min-x* 0) 38 (defvar *min-y* 0) ;; valeur minimale de y atteinte 39 (setf *min-y* 0) 40 *current*)) 41 42 #| Les fonctions "right" "down", "down", "up" imitent le movement des 43 coordonnées sur un graphe mais au les coordonnées "y" positifs sont en DESSOUS du graphe 44 |# 45 46 (defun right (L) 47 (progn 48 (push 49 (setf *current* 50 (cons (+ 1 (first L)) (cons (+ 1 (second L)) (last L)))) *db*) 51 *current*)) 52 53 (defun left (L) 54 (progn 55 (push 56 (setf *current* 57 (cons (+ 1 (first L)) (cons (- (second L) 1) (last L)))) *db*) 58 *current*)) 59 60 (defun up (L) 61 (progn 62 (push 63 (setf *current* 64 (cons (+ 1 (first L)) (cons (second L) (cons (+ (third L) 1) ())))) *db*) 65 *current*)) 66 67 (defun down (L) 68 (progn 69 (push 70 (setf *current* 71 (cons (+ 1 (first L)) (cons (second L) (cons (- (third L) 1) ())))) *db*) 72 *current*)) 73 74 (defun update-max-x (L) 75 (if (> (second L) *max-x*) 76 (setf *max-x* (second L)) 77 nil)) 78 79 (defun update-max-y (L) 80 (if (> (third L) *max-y*) 81 (setf *max-y* (third L)) 82 nil)) 83 84 (defun update-min-x (L) 85 (if (< (second L) *min-x*) 86 (setf *min-x* (second L)) 87 nil)) 88 89 (defun update-min-y (L) 90 (if (> (third L) *max-y*) 91 (setf *min-y* (third L)) 92 nil)) 93 94 (defun print-all () 95 (print "*current*") 96 (print *current*) 97 (print "*max-x*: ~S") 98 (print *max-x*)) 99 100 (defun update-all (L) 101 (cond 102 ((> (second L) *max-x*) 103 (setf *max-x* (second L))) 104 ((> (third L) *max-y*) 105 (setf *max-y* (third L))) 106 ((< (second L) *min-x*) 107 (setf *min-x* (second L))) 108 ((< (third L) *min-y*) 109 (setf *min-y* (third L))) 110 (t ()))) 111 112 ;; "move" s'occupe de choisir "right", "down-left" etc. selon les valeurs dans *current* 113 (defun move (L) 114 (cond 115 ((and (zerop (second L)) (zerop (third L))) ; if x== 0 && y==0 then go right TO BEGIN 116 (print "in RIGHT") 117 (right L)) 118 ((and (= *min-y* (- *max-y*)) (< (second L) (+ (- *min-x*) 1))) 119 (print "in RIGHT") 120 (right L)) 121 ((and (= *max-x* (+ (- *min-x*) 1)) (< (third L) (+ (- *min-y*) 1))) 122 (print "in UP") 123 (up L)) 124 ((and (= *max-y* (+ (- *min-y*) 1)) (> (second L) (- *max-x*))) 125 (print "in LEFT") 126 (left L)) 127 ((and (= *min-x* (- *max-x*)) (> (third L) (- *max-y*))) 128 (print "in DOWN") 129 (down L)) 130 (t *current*) 131 )) 132 133 134 #| 135 On fait un "move" et puis un "update-max-x-y" 136 Attention : il faut bien faire un setf L, sinon, le paramètre L de "update-max-x-y utilise la valeur 137 de L inchangé ! 138 |# 139 (defun move-and-update (L) 140 (progn 141 (setf L (move L)) 142 (update-all L) 143 *db*)) 144 145 ;; "zig-zag" fait n "move-and-update" en un seul coup et affiche le contenu de *db* (toutes les couples) 146 (defun zig-zag (L n) 147 (if (zerop n) 148 (move-and-update *current*) 149 (progn 150 (move-and-update *current*) 151 (zig-zag L (- n 1)))))