Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LISP > Опишите функцию, выполняющую обработку


Автор: julmak 28.10.2014, 14:17
Дан список, содержащий атомы и списки. Каждый элемент-список содержит символьный атом и номера позиций на которых должен размещаться этот атом в списке-результате. Элементы-атомы размещаются в результате на позициях, не занятых при размещении атомов из элементов-списков. Если после размещения всех данных элементов в списке - результате остаются незанятые промежуточные позиции, то на этих позициях должен стоять(). К примеру:
((a 1 3 6) c (d 2 5)) представить в виде (a d a c d a).

Автор: _sg 28.10.2014, 21:35
Код

(defun deploy-atoms (w &aux (v (remove-if #'atom w))
                     (z (remove-if-not #'atom w)))
  (deploy (sort (mapcan #'atom-num  v) #'< :key #'cadr) z))

(defun deploy (w v &optional (n 1)
               &aux (a (car w)) (d (cdr w)))
  (cond ((null w) nil)
        ((= (cadr a) n) (cons (car a) (deploy d v (1+ n))))
        (t (cons (car v) (deploy w (cdr v) (1+ n))))))

(defun atom-num (w &aux (a (car w))(d (cdr w)))
  (mapcar #'(lambda (e) `(,a ,e)) d))

> (deploy-atoms '((a 1 3 6) c (d 2 5)))
(A D A C D A)


Добавлено через 11 минут и 26 секунд
Код

(defun deploy-atoms (w)
  (deploy (sort (mapcan #'atom-num
                        (remove-if #'atom w))
                #'< :key #'cadr)
          (remove-if-not #'atom w)))

(defun deploy (w v &optional (n 1) &aux (a (car w)))
  (when w (if (= (cadr a) n)
              (cons (car a) (deploy (cdr w) v (1+ n)))
              (cons (car v) (deploy w (cdr v) (1+ n))))))

(defun atom-num (w &aux (a (car w)))
  (mapcar #'(lambda (e) `(,a ,e)) (cdr w)))

> (deploy-atoms '((a 1 3 6) (d 2 5)))
(A D A NIL D A)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)