(defun rotate (m) (apply #'map 'list #'vector (reverse m))) (defun merge-line (&rest lines) (apply #'map 'string (lambda (&rest chars) (or (find #\Space chars :test #'char/=) #\Space)) lines)) (defun merge-matrix (&rest matrices) (apply #'mapcar #'merge-line matrices)) (defun write-cross (s) (let* ((m (let* ((n (length s)) (empty (format nil "~V@T~V@T~V@T " n n n)) (line1 (format nil "~V@T~A~V@T " n s n)) (line2 (format nil "~A~V@T~A " s n s))) `(,line1 ,@(make-list (1- n) :initial-element empty) ,line2 ,@(make-list (* 2 n) :initial-element empty)))) (m1 (rotate m)) (m2 (rotate m1)) (m3 (rotate m2))) (mapc #'write-line (merge-matrix m m1 m2 m3))))