;;; Exercice 1 ;; 1- (defun uncompress-pairs (pairs) ;; avec loop et make-array (let ((l (loop for pair in pairs nconc (make-list (car pair) :initial-element (cdr pair))))) (make-array (length l) :initial-contents l))) (defun uncompress-pairs (pairs) ;; avec mapcan et coerce (let ((l (mapcan (lambda (pair) (make-list (car pair) :initial-element (cdr pair))) pairs))) (coerce l 'vector))) ;; 2- (defparameter *pairs* '((1 . 3) (4 . 2) (1 . 0) (2 . 1))) (uncompress-pairs *pairs*) ;;; Exercice 2 ;; 1- (defun print-image (image &optional (c "@")) (flet ((print-line (line) (loop for i from 0 below (length line) do (let ((val (aref line i))) (format t "~A" (if (zerop val) " " c))) finally (format t "~%")))) (let ((h (length image))) (loop for line from 0 below h do (print-line (aref image line)))))) ;; 2- (print-image #(#(1 1 0) #(0 1 0) #(0 1 1))) ;; 3- voir 1- ;; 4- (defun image2vector (image) (let* ((h (length image)) (w (length (aref image 0))) (v (make-array (* h w)))) (loop with k = -1 for line from 0 below h do (loop for column from 0 below w do (setf (aref v (incf k)) (aref (aref image line) column))) finally (return v)))) ;;; Exercice 3 ;; 1- (mystere-vector #()) ;; 2- (mystere-vector #(2 2 2 0 0 1 1 1 2) ;; 3- tout est dans le nom de la fonction ci-dessous ;; 4- (defun compress-vector (v) ;; avec do (let ((len (length v))) (when (zerop (length v)) (return-from compress-vector '())) (do ((pairs (list (cons 1 (aref v 0)))) ;; le premier element vu une fois (i 1 (1+ i))) ((>= i len) (nreverse pairs)) (if (= (cdr (car pairs)) (aref v i)) (incf (car (car pairs))) ;; l'element courant vu une nouvelle fois (push (cons 1 (aref v i)) pairs))))) ;; on change d'element