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

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

lisp помогите обработать список

Ответ
Поиск в этой теме
Непрочитано 17.08.2010, 11:51
lisp помогите обработать список
Apelsinov
 
Проектировщик ВК. LISP-любитель.
 
Москва
Регистрация: 15.12.2003
Сообщений: 1,163

я очень извиняюсь, помогите, пожалуйста, вот вроде простая задачка, но не получается:

нужно список типа '((A 1) (A 2) (A 5) (B 6) (B 8) (C 4) (C 9)...)
превратить в ((A 8)) (B 14) (C 13)...)
где 8, 14 и 13 - суммы соответствующих вторых элементов подсписков.

голову уже сломал, все время получаются какие-то громоздкие конструкции, в которых я сам уже запутался...
Просмотров: 8787
 
Непрочитано 16.11.2014, 23:33
#21
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
<phrase 1=


Да, плмню. Я раз 20 прогнал ее в пошаговом режиме прежде чем понял почему как она работает
__________________
Мне не нужно сделать за меня. Если я что-то ищу, то пути решения.
Kirill_Ja вне форума  
 
Непрочитано 17.11.2014, 00:10
#22
gomer

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


Цитата:
Сообщение от Kirill_Ja Посмотреть сообщение
Да, плмню. Я раз 20 прогнал ее в пошаговом режиме прежде чем понял почему как она работает
Ну все просто: берешь шашлык на шампуре и три шампура сверху, снимаешь мяско и нанизываешь на первый шампур, снимаешь помидорчик, нанизываешь на второй шампур. и так пока есть что снимать. потом помидорчики нанизываешь на третий шампур, потом мяско, в конце концом отдаешь третий шампур генацвале...
gomer вне форума  
 
Непрочитано 16.07.2021, 11:52
#23
WST


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


Добрый день. Подыму тему.
Помогите пожалуйста, есть список (1 2 2 2 3 4 5 6 6 7 8 9 15 20 21 21 21 21 23 24 n)
нужно получить два списка:
1. ((2 3)(6 2)(21 4)) где вторые числа подсписка количество первых в исходном списке
2. ((10 11 12 13 14)(16 17 18 19)(22)(25 26 .... n-2 n-1)) недостающие числа в исходном списке

Последний раз редактировалось WST, 16.07.2021 в 13:34.
WST вне форума  
 
Непрочитано 16.07.2021, 12:15
1 | #24
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 38,409


Тупо в лоб:
Код:
[Выделить все]
 (setq lst '(1 2 2 2 3 4 5 6 6 7 8 9 15 20 21 21 21 21 23 24)
      res nil
) ;_ end of setq

(foreach item lst
  (if (setq temp (assoc item res))
    (setq res (subst (cons item (1+ (cdr temp))) temp res))
    (setq res (cons (cons item 1) res))
  ) ;_ end of if
) ;_ end of foreach

(vl-remove-if-not (function (lambda (x) (= (cdr x) 1))) res)
(vl-remove-if (function (lambda (x) (= (cdr x) 1))) res)
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.07.2021, 13:33
#25
WST


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Тупо в лоб:
Код:
[Выделить все]
 (setq lst '(1 2 2 2 3 4 5 6 6 7 8 9 15 20 21 21 21 21 23 24)
      res nil
) ;_ end of setq

(foreach item lst
  (if (setq temp (assoc item res))
    (setq res (subst (cons item (1+ (cdr temp))) temp res))
    (setq res (cons (cons item 1) res))
  ) ;_ end of if
) ;_ end of foreach

(vl-remove-if-not (function (lambda (x) (= (cdr x) 1))) res)
(vl-remove-if (function (lambda (x) (= (cdr x) 1))) res)
Кулик Алексей aka kpblc спасибо огромное за помощь, первый список получили все как просил, а со вторым как быть?
WST вне форума  
 
Непрочитано 16.07.2021, 13:36
#26
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 38,409


Две последние строчки как раз и возвращают просимое: одна - один список, вторая - второй. ПРисваивай своим переменным и вперед ))
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.07.2021, 13:41
#27
WST


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Две последние строчки как раз и возвращают просимое: одна - один список, вторая - второй. ПРисваивай своим переменным и вперед ))
Присвоил и вот что получаем
(setq lst1(vl-remove-if-not (function (lambda (x) (= (cdr x) 1))) res)
lst2(vl-remove-if (function (lambda (x) (= (cdr x) 1))) res)
)

Command: !lst
(1 2 2 2 3 4 5 6 6 7 8 9 15 20 21 21 21 21 23 24)

Command: (reverse lst1)
((1 . 1) (3 . 1) (4 . 1) (5 . 1) (7 . 1) (8 . 1) (9 . 1) (15 . 1) (20 . 1) (23 . 1) (24 . 1))

Command: (reverse lst2)
((2 . 3) (6 . 2) (21 . 4))
WST вне форума  
 
Непрочитано 16.07.2021, 13:47
#28
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 38,409


Ну и ?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.07.2021, 13:50
#29
WST


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


Цитата:
Сообщение от WST Посмотреть сообщение
1. ((2 3)(6 2)(21 4)) где вторые числа подсписка количество первых в исходном списке
2. ((10 11 12 13 14)(16 17 18 19)(22)(25 26 .... n-2 n-1)) недостающие числа в исходном списке
первый тот
второй не тот
WST вне форума  
 
Непрочитано 16.07.2021, 13:51
#30
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 38,409


(mapcar (function car) (vl-sort (vl-remove-if (function (lambda (x) (= (cdr x) 1))) res) (function <))
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.07.2021, 14:14
#31
WST


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
(mapcar (function car) (vl-sort (vl-remove-if (function (lambda (x) (= (cdr x) 1))) res) (function <))
Command: !res
((24 . 1) (23 . 1) (21 . 4) (20 . 1) (15 . 1) (9 . 1) (8 . 1) (7 . 1) (6 . 2) (5 . 1) (4 . 1) (3 . 1) (2 . 3) (1 . 1))

Command: (mapcar (function car) (vl-sort (vl-remove-if (function (lambda (x) (= (cdr x) 1))) res) (function <))
(_> )
bad argument type: VLA-OBJECT nil

Command: (mapcar (function car) (vl-sort (vl-remove-if (function (lambda (x) (= (cdr x) 1))) res) (function <)))
bad argument type: VLA-OBJECT nil

скобки не хватает может я не там ее поставил?

Command: (vl-remove-if (function (lambda (x) (= (cdr x) 1))) res)
((21 . 4) (6 . 2) (2 . 3))

Command: (vl-sort (vl-remove-if (function (lambda (x) (= (cdr x) 1))) res) (function <))
bad argument type: VLA-OBJECT nil

что то не так
WST вне форума  
 
Непрочитано 16.07.2021, 14:50
1 | #32
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 38,409


Код:
[Выделить все]
 (setq lst '(1 2 2 2 3 4 5 6 6 7 8 9 15 20 21 21 21 21 23 24)
      res nil
) ;_ end of setq

(foreach item lst
  (if (setq temp (assoc item res))
    (setq res (subst (cons item (1+ (cdr temp))) temp res))
    (setq res (cons (cons item 1) res))
  ) ;_ end of if
) ;_ end of foreach

(setq lst1 (mapcar (function car) (vl-remove-if-not (function (lambda (x) (= (cdr x) 1))) res))
      lst2 (vl-remove-if (function (lambda (x) (= (cdr x) 1))) res)
) ;_ end of setq
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.07.2021, 15:33
1 | #33
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,284


только для целых чисел
Код:
[Выделить все]
 (setq _list '(1 2 2 2 3 4 5 6 6 7 8 9 15 20 21 21 21 21 23 24))
(setq index 0 list_1 nil list_2 nil _list_i_s (vl-sort-i _list '<) _list_i (vl-sort (vl-sort-i _list '<) '<))
(while (/= index (length _list))
	(if (/= (nth index _list_i_s) (nth index _list_i))
		(setq list_1 (append list_1 (list (list (nth index _list) (1+ (- (nth index _list_i_s) (nth index _list_i))))))
			  index (+ index (1+ (- (nth index _list_i_s) (nth index _list_i))))
		)
		(setq index (1+ index))
	)
)
(setq index 0 _list_s (vl-sort _list '<))
(while (/= index (1- (length _list_s)))
	(if (/= (nth (1+ index) _list_s) (1+ (nth index _list_s)))
		(progn
			(setq missed_list nil)
			(repeat (1- (- (nth (1+ index) _list_s) (setq missed (nth index _list_s))))
				(setq missed_list (append missed_list (list (setq missed (1+ missed)))))
			)
			(setq list_2 (append list_2 (list missed_list)))
		)
	)
	(setq index (1+ index))
)
(print list_1)
(print list_2)
koMon вне форума  
 
Непрочитано 16.07.2021, 15:56
#34
WST


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


Кулик Алексей aka kpblc, Спасибо
koMon, Спасибо то что нужно, только для целых и надо
WST вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > lisp помогите обработать список

Система Техэксперт дает уверенность в правильности и эффективности принимаемых инженерных решений!
Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Lisp показывает ошибку Плохо сформированный список на входе BBLainer LISP 20 27.04.2010 18:40
Lisp, помогите с алгоритмом "подтягивания" поллиний 2123 LISP 1 03.02.2010 23:58
Lisp: Список элементов в слоях ALFMario LISP 4 29.04.2008 17:26
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47
Помогите отладить lisp программу Мишаня LISP 7 31.07.2006 12:54