LISP: функция Nth наоборот
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP: функция Nth наоборот

LISP: функция Nth наоборот

Ответ
Поиск в этой теме
Непрочитано 18.03.2013, 19:02 #1
LISP: функция Nth наоборот
WhiteShark
 
Регистрация: 30.03.2012
Сообщений: 101

Есть ли красивая реализация у кого нибудь функции которая возвращает весь список только без элемента за номером N?
Просмотров: 6296
 
Непрочитано 18.03.2013, 19:19
#2
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


А самому подумать?
gomer вне форума  
 
Автор темы   Непрочитано 18.03.2013, 19:25
#3
WhiteShark


 
Регистрация: 30.03.2012
Сообщений: 101


Да я то сделал вот такую... но мне не нравится
Код:
[Выделить все]
 (defun invNth (lst N / k newlst)
  (setq k 0)
  (if lst
    (progn
      (while lst
	(if (/= k N)
	  (setq newlst (append newlst (car lst)))
	  )
	(setq k (1+ k))
	(setq lst (cdr lst))
      )
    newlst
    )
  )
)
WhiteShark вне форума  
 
Непрочитано 18.03.2013, 19:35
#4
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


забыли list
Код:
[Выделить все]
 (setq newlst (append newlst (list (car lst))))
вообще рекурсивно это гораздо проще решается
gomer вне форума  
 
Автор темы   Непрочитано 18.03.2013, 19:43
#5
WhiteShark


 
Регистрация: 30.03.2012
Сообщений: 101


Ну я вот и чувствую что можно лучше.. но не могу сложить в кучу. Не подскажите как рекурсивно?
WhiteShark вне форума  
 
Непрочитано 18.03.2013, 19:48
#6
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Код:
[Выделить все]
 (defun butnth (i lst)
  (if (zerop i)
    (cdr lst)
    (cons (car lst)
	  (butnth
	    (1- i)
	    (cdr lst)
	  )
    )
  )
)
Настоятельно рекомендую начать изучать рекурсию
ну и еще вопрос: нафига это надо?
gomer вне форума  
 
Автор темы   Непрочитано 18.03.2013, 22:31
#7
WhiteShark


 
Регистрация: 30.03.2012
Сообщений: 101


Спрашивали? Отвечаем :-)

Стоит задача по списку вида ((x1 y1 z1) (x2 y2 z2) ... ... ), содержащему наборы координат концов линий, определить образуют ли они замкнутый контур.
Ну и вообще, в принципе, как же получать список без какого то элемента? (vl-remove-if не подходит из за того что элемент не уникальный)
WhiteShark вне форума  
 
Непрочитано 18.03.2013, 23:03
#8
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Looking for a faster version of delete_nth, insert_nth and switch_nth
Парочка функций из этой темы (там требутся регистрация)
http://forum.dwg.ru/showthread.php?p=676403#post676403
http://forum.dwg.ru/showthread.php?t=80369
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 19.03.2013, 00:14
#9
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от WhiteShark Посмотреть сообщение
Стоит задача по списку вида ((x1 y1 z1) (x2 y2 z2) ... ... )
Это список точек, а не отрезков
gomer вне форума  
 
Автор темы   Непрочитано 19.03.2013, 01:50
#10
WhiteShark


 
Регистрация: 30.03.2012
Сообщений: 101


Уважаемый gomer, я именно так ((x1 y1 z1) (x2 y2 z2) ... ... ) написал, чтоб было понятно, что каждый отрезок задан координатой начала и конца, идущими подряд. Задача проверить контур на незамкнутость весьма проста: список не будет содержать по два раза одни и те же координаты или будет нечетное количество элементов. Я пытаюсь решить задачу сложнее: попытаться составить из такого списка замкнутый контур (то есть еще и упорядочить его). Для чего нужно попробовать выстроить из данного набора координат цепочку, где каждая конечная координата одного отрезка соседствует с такой же начальной координатой следующего (ну а голова равна хвосту). Если цепочка выстроится, то контур замкнутый.

VVA, как всегда спасибо!

Последний раз редактировалось WhiteShark, 19.03.2013 в 01:57. Причина: поправил
WhiteShark вне форума  
 
Непрочитано 20.03.2013, 17:50
#11
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Цитата:
Есть ли красивая реализация у кого нибудь функции которая возвращает весь список только без элемента за номером N?
Красивая говоришь...
Может и не супер красивая, но зато быстрая.

Код:
[Выделить все]
 (defun remove-i (i lst)
      (setq i (1+ i))
      (vl-remove-if '(lambda (x) (zerop (setq i (1- i)))) lst)
    )
считается что первый список в листе - номер 0.
Sleekka вне форума  
 
Непрочитано 20.03.2013, 18:31
#12
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Рекурсивненько тоже можно
Код:
[Выделить все]
;;fixo () 2013 * all rights released
(defun remove-by-index	 (lst idx)
  (if (car lst)
    (cons (vl-remove-if
	    '(lambda (a) (= (vl-position a (car lst)) idx))
	    (car lst))
	  (remove-by-index (cdr lst) idx))))
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 20.03.2013, 22:51
#13
WhiteShark


 
Регистрация: 30.03.2012
Сообщений: 101


Спасибо спасибо! С Nth уже понятно )
Намного более нетривиальная задачка - исходная (та, что в 10-ом посте). Если у кого мысли есть - скрывайте!

Если прям на пальцах то так: есть список

( (18 7 0) (23 59 0) (34 14 0) (18 7 0) (95 13 0) (34 14 0) (23 59 0) (95 13 0) )

надо получить из него

( (23 59 0) (95 13 0) (95 13 0) (34 14 0) (34 14 0) (18 7 0) (18 7 0) (23 59 0) )

Последний раз редактировалось WhiteShark, 20.03.2013 в 23:12.
WhiteShark вне форума  
 
Непрочитано 21.03.2013, 01:17
#14
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от WhiteShark Посмотреть сообщение
Если у кого мысли есть - скрывайте!
Поищи chain selection не помню где, склерозьм
Олег (jr.) вне форума  
 
Непрочитано 21.03.2013, 02:17
#15
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


см. #2
gomer вне форума  
 
Непрочитано 21.03.2013, 13:00
#16
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Цитата:
Если прям на пальцах то так: есть список
( (18 7 0) (23 59 0) (34 14 0) (18 7 0) (95 13 0) (34 14 0) (23 59 0) (95 13 0) )
надо получить из него
( (23 59 0) (95 13 0) (95 13 0) (34 14 0) (34 14 0) (18 7 0) (18 7 0) (23 59 0) )
А почему не так?
Код:
[Выделить все]
 '( (23 59 0) (34 14 0) (34 14 0) (18 7 0) (18 7 0) (95 13 0) (95 13 0) (23 59 0)  ))
 '( (34 14 0) (18 7 0) (18 7 0) (95 13 0) (95 13 0) (23 59 0) (23 59 0) (34 14 0)))
 '( (18 7 0) (95 13 0) (95 13 0) (34 14 0) (34 14 0) (23 59 0) (23 59 0) (18 7 0) ))
 '( (18 7 0) (34 14 0) (34 14 0) (95 13 0) (95 13 0) (23 59 0) (23 59 0) (18 7 0) ))
__________________
Никогда не спорьте с дураками - они опустят Вас до своего уровня и победят за счет опыта
CB вне форума  
 
Автор темы   Непрочитано 21.03.2013, 14:07
#17
WhiteShark


 
Регистрация: 30.03.2012
Сообщений: 101


Олег (jr.), спасибо, попробую найти!
gomer, спасибо, я уже почти придумал ) просто есть непреодолимая тяга сделать всё так же красиво как вы
CB, первый, третий и четвертый списки неправильные потому, что в исходном списке элементы (подсписки) 1и2, 3и4 и т.д. образуют неразрывные пары, т.к. описывают начало и конец одного отрезка
WhiteShark вне форума  
 
Непрочитано 21.03.2013, 17:32
#18
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


WhiteShark, ничего не понятно какой тебе алгоритм нужен?

http://algolist.manual.ru/maths/geom...ull/graham.php
этот что-ли?
Sleekka вне форума  
 
Непрочитано 21.03.2013, 18:22
#19
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Поищи chain selection не помню где, склерозьм
Пробы пера были здесь
http://forum.dwg.ru/showthread.php?p=134515#post134515
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 22.03.2013, 00:47
#20
WhiteShark


 
Регистрация: 30.03.2012
Сообщений: 101


Чтоб не заругали модераторы, спрошу прямо тут. Почему моя функция как то странно работает? Это сдвиг списка влево до тех пор пока не встретится передаваемый аргумент. (ну случай что он не встретится вообще пока не знаю как учесть получше)
Код:
[Выделить все]
 
(defun lshift (elem lst  /)
       (cond ((= (car lst) elem) lst)
               (T (lshift (append  (cdr lst) (list (car lst)) )  elem))
       )
)
(lshift 3 '(1 2 3 4)) возвращает как и задумывалось (3 4 1 2), но

(lshift '(3) '((1) (2) (3) (4))) делает stack overflow
Подскажите в чем дело?
WhiteShark вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP: функция Nth наоборот



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AUTOCAD 2010 перестал переключаться в многооконный режим. Проблемы с переменными Андрей Х. AutoCAD 24 27.05.2015 10:17
Подправте старый лисп evg76 LISP 10 25.10.2012 10:23
Двутавр Born AutoCAD 14 26.03.2009 16:45
3D Konstruktor для проектировщиков КМ. Дима_ Готовые программы 17 10.07.2008 10:03
Помогите с автолиспом MaloI LISP 12 26.12.2006 08:05