Построение списка из элементов, встречающихся в списке n раз (XLisp)
Формулировка задачи:
Решение задачи: «Построение списка из элементов, встречающихся в списке n раз (XLisp)»
(defun filling (n) (dotimes (i n t) (let ((r (random 4))) (cond ((= r 0) (let ((dec (cdr a))) (rplacd a (1+ dec))) (setq *pool* (cons a *pool*))) ((= r 1) (let ((dec (cdr b))) (rplacd b (1+ dec))) (setq *pool* (cons b *pool*))) ((= r 2) (let ((dec (cdr c))) (rplacd c (1+ dec))) (setq *pool* (cons c *pool*))) ((= r 3) (let ((dec (cdr d))) (rplacd d (1+ dec))) (setq *pool* (cons d *pool*))))))) (defun printPool (p &optional acc) (cond ((null p) acc) ((member (caar p) acc) (printPool (cdr p) acc)) (t (printPool (cdr p) (cons (caar p) acc))))) (defun remove<n (n ls) ;; (remove<n 2 *pool*) (if ls (if (< (cdar ls) n) (remove<n n (cdr ls)) (cons (car ls) (remove<n n (cdr ls)))))) :;; Test. (setq a (cons 'a 0) b (cons 'b 0) c (cons 'c 0) d (cons 'd 0)) (setq *pool* nil) (filling 10) *pool* (printPool (remove<n 2 *pool*)) (printPool (remove<n 3 *pool*)) (printPool (remove<n 4 *pool*)) (printPool (remove<n 5 *pool*))
Объяснение кода листинга программы
В представленном коде реализованы две функции на языке Lisp: filling и printPool.
Функция filling заполняет указанный список n элементами из пула, после чего возвращает новый список, содержащий только уникальные элементы из исходного списка n (т.е. элементы, которые встречались в списке n более одного раза).
Функция printPool печатает элементы списка p (или, если указан аргумент acc, элементы списка p, являющиеся членами списка acc).
Также в коде определены четыре переменные: a, b, c, d, которые являются указателями на элементы пула.
В конце кода проводится тестирование: создаются четыре указателя на элементы пула, после чего вызывается функция filling для заполнения списка n элементами из пула. Затем вызывается функция printPool для печати списков, содержащих только уникальные элементы из исходного списка n (т.е. списки, содержащие только элементы, которые встречались в списке n более одного раза).
Список элементов, встречающихся в списке n два раза, будет следующим:
abСписок элементов, встречающихся в спискеnтри раза, будет следующим:cdСписок элементов, встречающихся в спискеnчетыре раза, будет следующим:aСписок элементов, встречающихся в спискеnпять раз, будет пустым, так как ни один элемент не встречается в спискеnпять раз.