Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 28.04.2015
Сообщений: 3
Common Lisp

Функция find-list-part

24.11.2019, 13:59. Показов 3261. Ответов 6

Студворк — интернет-сервис помощи студентам
Доброго времени, господа и дамы. Прошу помочь мастеров и гуру Лиспа решить задачу следующего формата:

Функция, которая принимает два аргумента l1, l2. Оба аргумента - списочные структуры с произвольными элементами. Вызов функции возвращает список, в котором каждый элемент - путь к вхождению l1 в качестве фрагмента в l2: список позиций на уровнях, приводящий к вхождению фрагмента. К примеру, вызов такого рода:

(find-list-part ’(a a (b) a)
’(c a a (b) a a (b) a (a d a a (b a a (b a a (b) a z) a h a a (b) a) a)))

Возвратит следующее:

((2) (5) (9 5 4 2) (9 5 7))

Очень прошу подсобить тех, кому будет не трудно. Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.11.2019, 13:59
Ответы с готовыми решениями:

Функция List и Quote
Доброго вечера всем! Лисп читаю 2-ой день, много чего не понимаю, но нужно разобраться, препод не ставит, пока сами не разберёмся. Помогите...

Рекурсивная функция MAKE-LIST
Добрый день. Помогите найти ошибку в решении задачи. Напишите указанную рекурсивную функцию. Сравните результат её работы с аналогичной...

Как минимально просто использовать функция std::find с последовательность типа : list<myClass*>
Добрый день. Как минимально просто использовать функция std::find с последовательность типа : list&lt;myClass*&gt;,если в классе перегружен...

6
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,707
Записей в блоге: 14
24.11.2019, 16:21
Aquila21, что-то непонятно... Почему первые 2 элемента в скобках? Первый список входит во второй действительно со 2-й и 5-й позиции (если считать с 1). Начало результата должно быть (2 5 ...) Что означает (9 5 4 2)? и (9 5 7)?
2
0 / 0 / 0
Регистрация: 28.04.2015
Сообщений: 3
24.11.2019, 17:25  [ТС]
Catstail, здравствуйте и спасибо за отклик. Честно сказать, я и сам недоумеваю, но условие - всё, чем я располагаю. Если озвучивать его из первоисточника, то выглядит оно следующим образом:

" Описать функцию find-list-part двух аргументов l1 и l2, где оба аргумента — списочные структуры с произвольными элементами. Вызов (find-list-part l1 l2) должен возвращать список, в котором каждый элемент — путь к вхождению l1 в качестве фрагмента в l2: список позиций на уровнях, приводящий к вхождению фрагмента. Например, вызов:

(find-list-part ’(a a (b) a)
’(c a a (b) a a (b) a (a d a a (b a a (b a a (b) a z) a h a a (b) a) a)))

должен возвратить:

((2) (5) (9 5 4 2) (9 5 7)) "

Сама задача относится к теме "Сложные списочные структуры", если это хоть как-то поможет приблизиться к разгадке.
0
 Аватар для zeroalef
200 / 236 / 33
Регистрация: 29.03.2019
Сообщений: 667
30.11.2019, 03:37
Цитата Сообщение от Catstail Посмотреть сообщение
Что означает (9 5 4 2)? и (9 5 7)?
рекурсия:
==>
9 -> (c a a (b) a a (b) a (a d a a (b a a (b a a (b) a z) a h a a (b) a) a))
5 -> (c a a (b) a a (b) a (a d a a (b a a (b a a (b) a z) a h a a (b) a) a))
4 -> (c a a (b) a a (b) a (a d a a (b a a (b a a (b) a z) a h a a (b) a) a))
2 -> (b a a (b) a z)
==>
9 -> (c a a (b) a a (b) a (a d a a (b a a (b a a (b) a z) a h a a (b) a) a))
5 -> (c a a (b) a a (b) a (a d a a (b a a (b a a (b) a z) a h a a (b) a) a))
7 -> (c a a (b) a a (b) a (a d a a (b a a (b a a (b) a z) a h a a (b) a) a))
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,707
Записей в блоге: 14
03.12.2019, 11:06
Лучший ответ Сообщение было отмечено Aquila21 как решение

Решение

Нормальные лисперы считают позиции с нуля, а не с единицы:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(defun task (lst w &optional (pth nil) (res nil) (pos 0))
  (let ((lw (length w)))
    (cond ((null lst) res)
          ((and (>= (length lst) lw)(equal (subseq lst 0 lw) w))
           (task (cdr lst) w pth (append (list (append pth (list pos))) res)
                 (+ pos 1)))
          ((listp (car lst)) 
           (append (task (cdr lst) w pth res (+ pos 1))
                   (task (car lst) w (append pth (list pos)) nil 0)))
          (t (task (cdr lst) w pth res (+ pos 1))))))
 
(task '(c a a (b) a a (b) a (a d a a (b a a (b a a (b) a z) a h a a (b) a) a))
      '(a a (b) a))
 
==> ((4) (1) (8 4 6) (8 4 3 1))
2
 Аватар для _sg
4709 / 4404 / 380
Регистрация: 12.05.2012
Сообщений: 3,101
04.12.2019, 23:04
Лучший ответ Сообщение было отмечено Catstail как решение

Решение

как вариант:
Lisp
1
2
3
4
5
6
7
8
9
10
(defun pths (v w &optional (m (length v)) p (n 1) ac
             &aux (a (car w)) (d (cdr w)))
  (cond ((null w) ac)
        ((and (>= (length w) m)(equal v (subseq w 0 m)))
         (pths v d m p (1+ n) (cons (reverse (cons n p)) ac)))
        ((nconc (pths v d m p (1+ n) ac)
                (when (listp a) (pths v a m (cons n p) 1))))))
 
> (pths '(a a (b) a) '(c a a (b) a a (b) a (a d a a (b a a (b a a (b) a z) a h a a (b) a) a)))
((5) (2) (9 5 7) (9 5 4 2))
Добавлено через 2 минуты
Lisp
1
2
3
4
5
6
7
8
9
10
(defun pths (v w &optional (m (length v)) p (n 1) ac
             &aux (a (car w)) (d (cdr w)))
  (if w (if (and (>= (length w) m)(equal v (subseq w 0 m)))
            (pths v d m p (1+ n) (cons (reverse (cons n p)) ac))
            (nconc (pths v d m p (1+ n) ac)
                   (when (listp a) (pths v a m (cons n p) 1))))
      ac))
 
> (pths '(a a (b) a) '(c a a (b) a a (b) a (a d a a (b a a (b a a (b) a z) a h a a (b) a) a)))
((5) (2) (9 5 7) (9 5 4 2))
Добавлено через 3 часа 35 минут
Lisp
1
2
3
4
5
6
7
8
9
10
(defun pths (v w &optional (m (length v)) p (n 1) ac
             &aux (a (car w)) (d (cdr w)))
  (cond ((null w) ac)
        ((and (>= (length w) m)(equal v (subseq w 0 m)))
         (pths v d m p (1+ n) (cons (reverse (cons n p)) ac)))
        ((revappend (pths v d m p (1+ n) ac)
                    (when (listp a) (pths v a m (cons n p) 1))))))
 
> (pths '(a a (b) a) '(c a a (b) a a (b) a (a d a a (b a a (b a a (b) a z) a h a a (b) a) a)))
((2) (5) (9 5 4 2) (9 5 7))
Lisp
1
2
3
4
5
6
7
8
9
10
(defun pths (v w &optional (m (length v)) p (n 1) ac
             &aux (a (car w)) (d (cdr w)))
  (if w (if (and (>= (length w) m)(equal v (subseq w 0 m)))
            (pths v d m p (1+ n) (cons (reverse (cons n p)) ac))
            (revappend (pths v d m p (1+ n) ac)
                       (when (listp a) (pths v a m (cons n p) 1))))
      ac))
 
> (pths '(a a (b) a) '(c a a (b) a a (b) a (a d a a (b a a (b a a (b) a z) a h a a (b) a) a)))
((2) (5) (9 5 4 2) (9 5 7))
Добавлено через 2 минуты
Lisp
1
2
3
4
5
6
7
8
9
10
(defun pths (v w &optional (m (length v)) p (n 1) ac
             &aux (a (car w)) (d (cdr w)))
  (cond ((null w) ac)
        ((and (>= (length w) m)(equal v (subseq w 0 m)))
         (pths v d m p (1+ n) (cons (reverse (cons n p)) ac)))
        ((nreconc (pths v d m p (1+ n) ac)
                  (when (listp a) (pths v a m (cons n p) 1))))))
 
> (pths '(a a (b) a) '(c a a (b) a a (b) a (a d a a (b a a (b a a (b) a z) a h a a (b) a) a)))
((2) (5) (9 5 4 2) (9 5 7))
Добавлено через 56 секунд
Lisp
1
2
3
4
5
6
7
8
9
10
(defun pths (v w &optional (m (length v)) p (n 1) ac
             &aux (a (car w)) (d (cdr w)))
  (if w (if (and (>= (length w) m)(equal v (subseq w 0 m)))
            (pths v d m p (1+ n) (cons (reverse (cons n p)) ac))
            (nreconc (pths v d m p (1+ n) ac)
                     (when (listp a) (pths v a m (cons n p) 1))))
      ac))
 
> (pths '(a a (b) a) '(c a a (b) a a (b) a (a d a a (b a a (b a a (b) a z) a h a a (b) a) a)))
((2) (5) (9 5 4 2) (9 5 7))
1
 Аватар для _sg
4709 / 4404 / 380
Регистрация: 12.05.2012
Сообщений: 3,101
04.12.2019, 23:52
Portacle
Миниатюры
Функция find-list-part  
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.12.2019, 23:52
Помогаю со студенческими работами здесь

javax.wsdl.Part не имплементирует java.util.List.
Господа! Есть некий класс SomeForm extends ActionForm и у него поле private List parts. При этом в struts-config'e указано ...

List.Find: как сделать предикат
Есть список строк. Хочу сделать поиск но не могу понять как сделать предикат......

List<MyClass> sort & find
Доброе утро! Не знаю в ту ли ветку пишу, так что не пинайти :) До вечера надо мне узнать! 1) Как реализовать Сорт листа, по признаку...

Can't find FULLTEXT index matching the column list
помогите исправить ошибку с поиском Вот поля для ввода &lt;form action=&quot;search.php&quot; method=&quot;post&quot; name=&quot;form_s&quot;&gt; ...

List<>.Find, как сделать поиск по 2 полям?
public User FindUser(User user) { users.Find(delegate(User u) { return ((u.Login ==...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru