Продублировать символ в списке - Lisp
Формулировка задачи:
Решение задачи: «Продублировать символ в списке»
(defun task (lst a) (let ((c (- (length lst) (length (remove a lst))))) (cond ((zerop c) lst) ((= c 1) (apply 'append (mapcar #'(lambda (x) (if (eq x a) (list a a) (list x))) lst))) (t nil)))) ==> task (task '(1 2 3 4 g 5 6 7) 'g) ==> (1 2 3 4 g g 5 6 7) (task '(1 2 3 4 g 5 g 6 7) 'g) ==> NIL (task '(1 2 3 4 5 6 7) 'g) ==> (1 2 3 4 5 6 7)
Объяснение кода листинга программы
В коде определена функция task, которая принимает два аргумента: список lst и символ a.
Список lst продублирует символ a в указанном месте. Для этого используется функция remove, которая удаляет все вхождения символа a из списка lst. Затем с помощью функции length вычисляется разница между длиной исходного списка и длиной списка без символа a.
Если разница равна нулю, то список lst уже содержит символ a в нужном количестве, и функция возвращает его.
Если разница равна единице, то с помощью функции append объединяются два списка: lst и список, содержащий символ a. Затем с помощью функции mapcar создается новый список, в котором каждый элемент исходного списка lst заменяется на пару символов a, если он равен символу a, и остаётся неизменным в противном случае.
Если разница больше единицы, то функция возвращает nil.
Примеры использования функции task показывают, что если передать в качестве аргумента список, в котором уже есть символ a в нужном количестве, то список возвращается без изменений. Если же символ a отсутствует или присутствует в неправильном количестве, то в список вставляются недостающие или лишние символы a.