Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
221 / 10 / 0
Регистрация: 04.11.2012
Сообщений: 62

Перестановка атомов списка

01.12.2012, 22:36. Показов 2009. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! помогите пожалуйста написать функцию перестановки атомов верхнего уровня и нижнего уровня, учитывая промежуточное состояние списков. Поиск соответствующих элементов осуществляется слева направо. Количество атомов на обоих уровнях одинаково. Вывести модифицированный исходный список. Атомы, содержащиеся в исходном списке, имеют уровень 0 и называются атомами верхнего уровня, атомы, содержащиеся в следующем вложенном списке, имеют уровень 1 и т.д.

Пример
Пусть в исходном тексте программа имеет вид (defun p1(x) …). Обращение к ней следующее (p1 '(a (b (c)) d (e (f)))), тогда программа должна вывести результат:
(c (b (a)) f (e (d)))
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.12.2012, 22:36
Ответы с готовыми решениями:

Получить из списка произвольных атомов список атомов, которые в исходном списке встречаются один раз
Построить список атомов, которые встречаются в заданном списке ровно один раз.

Формирование списка атомов
Добрый день!Помогите пожалуйста решить задачу на LISP. Написать программу формирования списка, состоящего из всех атомов, которые не...

Очистка списка от повторяющихся атомов
Построить рекурсивную функцию средствами элементарного лиспа, которая принимает список. И возвращает список входящих в него атомов без...

9
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38188 / 21123 / 4307
Регистрация: 12.02.2012
Сообщений: 34,729
Записей в блоге: 14
02.12.2012, 15:27
Хорошая задача. Можно вопрос: все атомы различны?
0
221 / 10 / 0
Регистрация: 04.11.2012
Сообщений: 62
02.12.2012, 17:39  [ТС]
Да различны... вот в примере я показал как это должно выглядеть...
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38188 / 21123 / 4307
Регистрация: 12.02.2012
Сообщений: 34,729
Записей в блоге: 14
03.12.2012, 23:00
Вот решение (не уверен, что универсальное, но на трех уровнях, вроде-бы работает):

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
;; Замена
        
(let ((ra nil) (rb nil))
  (defun repl (lst a b)
     (let ((res nil))
          (dolist (i lst res)
           (if (atom i)
            (cond ((And (eq i a) (null ra)) (progn (setq ra t) (setq res (Append res (list b)))))
                  ((And (eq i b) (null rb)) (progn (setq rb t) (setq res (Append res (list a)))))
                  (t (setq res (Append res (list i)))))
            (setq res (append res (list (repl i a b))))))))      
  (defun reset-repl nil (setq ra nil rb nil))
)
 
        
;; Разметка
         
 (defun mark (lst &OPTIONAL (L 0) (res NIL)) 
   (COND ((NULL lst) res) 
         ((ATOM (CAR lst)) 
            (COND ((= L 0) (mark (CDR lst) L (APPEND res (LIST (CAR lst))))) 
                  ((= L 2) (mark (CDR lst) L (APPEND res (LIST (CAR lst))))) 
                  (T (mark (CDR lst) L res))))
         (T (mark (CAR lst) (+ L 1) (mark (CDR lst) L res)))))
 
;; Список без последнего атома
         
(defun init (lst) 
  (cond ((null lst) nil)
        ((= (length lst) 1) nil)
        ((= (length lst) 2) (list (car lst)))
        (t (cons (car lst) (init (cdr lst))))))
        
;; Решение
 
(defun task (lst)
  (let ((cnt (mark lst)))
       (loop
          (reset-repl)
          (setq lst (repl lst (car cnt) (last cnt)))
          (setq cnt (init (cdr cnt)))
          (when (null cnt) (return lst))          
       )))
 
;; проверка:
 
(task '(a (b (c)) d (e (f))))
 
==> (c (b (a)) f (e (d)))
0
221 / 10 / 0
Регистрация: 04.11.2012
Сообщений: 62
06.12.2012, 23:05  [ТС]
Спасибо огромное))) А то я уже всю голову сломал)))))

Добавлено через 4 минуты
Хотя что то не работает)))) на (task '(a (b (c)) d (e (f)))) => ((C) (B (C)) (F) (E (F)))
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38188 / 21123 / 4307
Регистрация: 12.02.2012
Сообщений: 34,729
Записей в блоге: 14
06.12.2012, 23:12
Вот картинка:
Миниатюры
Перестановка атомов списка  
0
221 / 10 / 0
Регистрация: 04.11.2012
Сообщений: 62
07.12.2012, 21:16  [ТС]
Возможно у нас версии лисп разные.... у меня LispIDE который работает с командной строкой GNU CLISP 2.49
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38188 / 21123 / 4307
Регистрация: 12.02.2012
Сообщений: 34,729
Записей в блоге: 14
08.12.2012, 16:07
Да, дело, видимо, в этом. В LispWorks работает так, как у Вас. Буду исправлять.

Добавлено через 17 часов 23 минуты
Дело в том, что last в Common Lisp возвращает не последний элемент, а последний подсписок. Реализовал last_, которая возвращает элемент. Теперь работает (проверено в LispWorks):

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
(let ((ra nil) (rb nil))
  (defun repl (lst a b)
     (let ((res nil))
          (dolist (i lst res)
           (if (atom i)
            (cond ((And (eq i a) (null ra)) (progn (setq ra t) (setq res (Append res (list b)))))
                  ((And (eq i b) (null rb)) (progn (setq rb t) (setq res (Append res (list a)))))
                  (t (setq res (Append res (list i)))))
            (setq res (append res (list (repl i a b))))))))      
  (defun reset-repl nil (setq ra nil rb nil))
)
 
        
;; Разметка
         
 (defun mark (lst &OPTIONAL (L 0) (res NIL)) 
   (COND ((NULL lst) res) 
         ((ATOM (CAR lst)) 
            (COND ((= L 0) (mark (CDR lst) L (APPEND res (LIST (CAR lst))))) 
                  ((= L 2) (mark (CDR lst) L (APPEND res (LIST (CAR lst))))) 
                  (T (mark (CDR lst) L res))))
         (T (mark (CAR lst) (+ L 1) (mark (CDR lst) L res)))))
 
;; Список без последнего атома
         
(defun init (lst) 
  (cond ((null lst) nil)
        ((= (length lst) 1) nil)
        ((= (length lst) 2) (list (car lst)))
        (t (cons (car lst) (init (cdr lst))))))
        
;; Последний элемент списка
 
(defun last_ (lst)
   (cond ((null lst) nil)
         ((= 1 (length lst)) (car lst))
         (t (last_ (cdr lst)))))
        
        
;; Решение
 
(defun task (lst)
  (let ((cnt (mark lst)))
       (loop
          (reset-repl)
          (setq lst (repl lst (car cnt) (last! cnt)))
          (setq cnt (init (cdr cnt)))
          (when (null cnt) (return lst))          
       )))
1
221 / 10 / 0
Регистрация: 04.11.2012
Сообщений: 62
09.12.2012, 17:25  [ТС]
Да все отлично работает!)))) Спасибо большое! только в 47 строке вместо last! надо поставить last_ ну это скорее всего опечатка)))
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38188 / 21123 / 4307
Регистрация: 12.02.2012
Сообщений: 34,729
Записей в блоге: 14
09.12.2012, 18:51
Цитата Сообщение от Slavnoff Посмотреть сообщение
только в 47 строке вместо last! надо поставить last_
- да, конечно!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.12.2012, 18:51
Помогаю со студенческими работами здесь

Инверсия атомов для заданного списка
Инверсия состоит в замене местами атома самого высокого уровня атомом самого низкого уровня. Количество атомов на обоих уровнях одинаково....

Удаление из списка четных атомов (с учетом подсписков)
Опишите функцию, удаляющую из списка четные атомы (с учетом подсписков). К примеру из (1 (2 3 4) 5 (6) (7 (8 (9 10)) 11) 12) должен...

Проверить, состоят ли два списка из одних и тех же атомов
Здравствуйте, задача на общую рекурсию .Преподавателю не нравится мое решение , путем обхода одного из списков и удаления из него элементов...

Найти количество атомов многоуровневого списка на каждом уровне
Здравствуйте, нужна помощь, вот задание: Найти количество атомов списка с подсписков. Знаю что можно как-то решить её с помощью 4-5...

Применить рекурсию для переменных сбора атомов из списка
Применить рекурсию для переменных сбора атомов из списка L устранить все произвольные численные атомы. Помогите решить на Lisp пожалуйста


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru