Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
jm
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 19

Разбить список на подсписки с элементами, кратными n

26.11.2014, 15:26. Показов 2696. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Подскажите с решением данной задачи:
Разбить список целых чисел на подсписки, сохраняя порядок элементов: в первом списке содержатся элементы исходного списка, кратные 2; во втором - элементы, кратные 3; в третьем - элементы, кратные 4; и так далее.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.11.2014, 15:26
Ответы с готовыми решениями:

Подсписки с повторяющимися элементами
Народ выручайте как реализовать? Написать функцию, которая определяет, содержит ли список с подсписками повторяющиеся элементы. Заранее...

Функция, разбивающая список на подсписки
Добрый день Не могли бы вы подсказать мне, как сделать функцию, которая разбивает список элементов таким образом: Допустим, на вход...

Поделить список на подсписки длинны 1, 2, 3
Разбить список на подсписки длинны 1, 2, 3… Помогите написать задачу без рекурсии, не могу разобраться с ошибкой //Эта функция...

28
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
26.11.2014, 16:19
Вот:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(defun task (lst &optional (n 2) (res nil))
 (cond ((null lst) res)
       (t (let ((nxt (remove-if #'(lambda (x) (zerop (rem x n))) lst))
                (rst (remove-if-not #'(lambda (x) (zerop (rem x n))) lst)))
               (if (null rst)
                   (task nxt (+ n 1) res)
                   (task nxt (+ n 1) (append res (list rst))))))))
 
  
 
 
==> task
 
(task '(2 3 4 5 6 2 3 4 5 6 7 8 2 3 9 10 11 12))
 
==> ((2 4 6 2 4 6 8 2 10 12) (3 3 3 9) (5 5) (7) (11))
Но будет плохо, если в списке есть 1...
2
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
26.11.2014, 16:25
jm, Что значит "и так далее"?
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
26.11.2014, 16:26
А вот так все хорошо:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(defun task (lst)
  (let ((ls (remove 1 lst))
        (res nil)
        (tmp nil))
     (iter (for i upfrom 2)
        (setf tmp nil)
        (iter (for x in ls) (when (zerop (rem x i)) (collecting i into tmp)))
        (when tmp (setf res (append res (list tmp))))
        (setf ls (remove-if #'(lambda (x) (zerop (rem x i))) ls))
        (when (null ls) (return res)))))
  
==> task
 
(task '(2 3 4 5 6 2 3 4 5 6 7 8 2 3 9 10 11 12))
 
==> ((2 2 2 2 2 2 2 2 2 2) (3 3 3 3) (5 5) (7) (11))
 
(task '(2 3 1 1 4 5 6 2 3 4 5 6 7 8 2 3 9 10 11 12))
 
==> ((2 2 2 2 2 2 2 2 2 2) (3 3 3 3) (5 5) (7) (11))
Добавлено через 1 минуту
castorsky, я понял, что кратные удаляются из списка, так что он (список) рано или поздно кончится.
1
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
26.11.2014, 16:31
Catstail, Что-то Вы в обоих вариантах не то делаете.

Добавлено через 2 минуты
Цитата Сообщение от Catstail Посмотреть сообщение
я понял, что кратные удаляются из списка, так что он (список) рано или поздно кончится
Я понял что это вариант ленивости, а Вы само задание как-то не так поняли.
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
26.11.2014, 16:34
castorsky, во втором действительно ошибка. Правильно так:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(defun task (lst)
  (let ((ls (remove 1 lst))
        (res nil)
        (tmp nil))
     (iter (for i upfrom 2)
        (setf tmp nil)
        (iter (for x in ls) (when (zerop (rem x i)) (collecting x into tmp)))
        (when tmp (setf res (append res (list tmp))))
        (setf ls (remove-if #'(lambda (x) (zerop (rem x i))) ls))
        (when (null ls) (return res)))))
  
==> task
 
(task '(2 3 1 1 4 5 6 2 3 4 5 6 7 8 2 3 9 10 11 12))
 
==> ((2 4 6 2 4 6 8 2 10 12) (3 3 3 9) (5 5) (7) (11))
Добавлено через 1 минуту
Цитата Сообщение от castorsky Посмотреть сообщение
Я понял что это вариант ленивости, а Вы само задание как-то не так поняли.
- я просто выделяю все подсписки, какие удастся...
2
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
26.11.2014, 16:45
Lisp
1
2
3
4
5
6
7
8
9
10
;; racket-lang.org
(define (foo lst)
  (let ((n (apply max lst)))
    (filter (lambda (i) (not (null? (cadr i))))
            (for/list ([i (range 2 (add1 n))])
              (list i (for/list ([j lst] #:when (= (remainder j i) 0))
                        j))))))
 
(foo '(2 3 4 5 4 8 7 6 5 22 11))
'((2 (2 4 4 8 6 22)) (3 (3 6)) (4 (4 4 8)) (5 (5 5)) (6 (6)) (7 (7)) (8 (8)) (11 (22 11)) (22 (22)))
Цитата Сообщение от Catstail Посмотреть сообщение
я просто выделяю все подсписки, какие удастся
а надо сначала выделить все кратные 2, потом 3 и так до максимального.

Catstail, Вот у Вас во втором подсписке (кратные 3) 6 и 12 почему-то не попали, списка кратных 4 нету вовсе и т. д. что-то Вы не то решаете.
2
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
26.11.2014, 16:55
Рекурсивно-функциональное решение можно чуть улучшить (чтобы решить проблему единиц):

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
(defun task (lst &optional (n 2) (res nil))
 (cond ((forall lst #'(lambda (x) (= x 1))) res)
       (t (let ((nxt (remove-if #'(lambda (x) (zerop (rem x n))) lst))
                (rst (remove-if-not #'(lambda (x) (zerop (rem x n))) lst)))
               (if (null rst)
                   (task nxt (+ n 1) res)
                   (task nxt (+ n 1) (append res (list rst))))))))
 
==> task
 
(task '(1 2 3 4 5 6  1 1 1 7 8 24 23))
 
==> ((2 4 6 8 24) (3) (5) (7) (23))
Правда, по выч. затратам это решение очень неоптимально.

Добавлено через 2 минуты
Цитата Сообщение от castorsky Посмотреть сообщение
Catstail, Вот у Вас во втором подсписке (кратные 3) 6 и 12 почему-то не попали, списка кратных 4 нету вовсе и т. д. что-то Вы не то решаете.
- да, похоже, удалять - не лучший вариант. Еще подумаю.

Добавлено через 4 минуты
Ну, вот:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
(defun task (lst &optional (n 2) (res nil) (lmax (apply 'max lst)))
 (cond ((> n lmax) res)
       (t (let ((rst (remove-if-not #'(lambda (x) (zerop (rem x n))) lst)))
               (if (null rst)
                   (task lst (+ n 1) res lmax)
                   (task lst (+ n 1) (append res (list rst)) lmax))))))            
 
 
==> task
 
(task '(1 2 3 4 5 6  1 1 1 7 8 24 23))
 
==> ((2 4 6 8 24) (3 6 24) (4 8 24) (5) (6 24) (7) (8 24) (24) (23) (24))
3
jm
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 19
26.11.2014, 17:31  [ТС]
Catstail, а возможно ли, например, так:
на вход подать список целых чисел SP, потом найти максимальный элемент max в SP, поделить его пополам, и потом в цикле от i=2 до (max/2) пройтись по элементам SP и соответственно, если остаток rem(...) равен нулю, добавляем элемент в новый список?

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(defun FN (SP)
    (setq M 0 I 2)
    (foreach EL SP
        (cond ((> EL M) (setq M EL)))
    ) 
    (while (<= I M) 
        (foreach EL SP
            (setq SP1 ())
            (cond ((= (rem EL I) 0) (cons EL SP1)))
            
        )
        (print SP1)
        (setq I (1+ I))
    ) 
)
просто если такая идея работает, я не знаю как ее реализовать - у меня код выше не работает - список пустой получается, может подскажете, в чем проблема?

Добавлено через 2 минуты
Catstail, оу, у Вас похоже та же идея, всё понятно. Спасибо!

Добавлено через 17 минут
Catstail, спасибо за решение, но у меня AutoLisp (среда вроде бы Vital LISP for AutoCAD), и он ругается пока на "bad element in arguments list: (N 2)"
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
26.11.2014, 18:02
Цитата Сообщение от jm Посмотреть сообщение
найти максимальный элемент max в SP, поделить его пополам
- зачем делить пополам?

Добавлено через 1 минуту
jm, в автолиспе есть remove-if-not?
1
jm
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 19
26.11.2014, 18:18  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
- зачем делить пополам?
Catstail , я подумала, что, может быть, это максимальная кратность, грубо говоря, для всего списка, т.к. меня смущает, что в задании кратность максимальная не установлена
Цитата Сообщение от Catstail Посмотреть сообщение
в автолиспе есть remove-if-not?
там этой функции нет, как и &optional. Попробую сейчас посмотреть аналоги, может что-нибудь найду.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
26.11.2014, 18:52
jm, вот решение, которое будет работать:

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
;; Удалить из списка lst некратные n
 
(defun remove-d (lst n)
  (cond ((null lst) nil)
        ((> (rem (car lst) n) 0) (remove-d (cdr lst) n))
        (t (cons (car lst) (remove-d (cdr lst) n)))))
 
==> remove-d
 
(remove-d '(1 2 3 4 1 2 3 4) 2)
 
==> (2 4 2 4)
 
;; главная функция
 
(defun func (lst n res lmax)
 (cond ((> n lmax) res)
       (t (let ((rst (remove-d lst n)))
               (if (null rst)
                   (func lst (+ n 1) res lmax)
                   (func lst (+ n 1) (append res (list rst)) lmax)))))) 
 
==> func
 
;; Собственно решение:
 
(defun task (lst)
  (func lst 2 nil (apply '+ lst)))
 
==> task
 
(task '(1 2 3 4 11 2 3 4 7 23 18 19 11 17))
 
==> ((2 4 2 4 18) (3 3 18) (4 4) (18) (7) (18) (11 11) (17) (18) (19) (23))
3
jm
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 19
26.11.2014, 19:16  [ТС]
ему все равно не нравится, выдает:
"REMOVE-D
FUNC
TASK
; *** ERROR: bad function: (2 4 2 4 18)"
т.е. первые две выполняет
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
26.11.2014, 19:29
jm, ты должна ввести ТОЛЬКО (task '(1 2 3 4 11 2 3 4 7 23 18 19 11 17)) и нажать Enter. Я же просто картинку показал, все, что после ==> это ответ системы... Ох... Вот это скопируй и вставь.

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(defun remove-d (lst n)
  (cond ((null lst) nil)
        ((> (rem (car lst) n) 0) (remove-d (cdr lst) n))
        (t (cons (car lst) (remove-d (cdr lst) n)))))
 
;; главная функция
 
(defun func (lst n res lmax)
 (cond ((> n lmax) res)
       (t (let ((rst (remove-d lst n)))
               (if (null rst)
                   (func lst (+ n 1) res lmax)
                   (func lst (+ n 1) (append res (list rst)) lmax)))))) 
 
;; Собственно решение:
 
(defun task (lst)
  (func lst 2 nil (apply '+ lst)))
 
(task '(1 2 3 4 11 2 3 4 7 23 18 19 11 17))
1
jm
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 19
26.11.2014, 19:37  [ТС]
Catstail, я поняла, что после ==> Вы показали результат) собственно, все делала так, как Вы указали выше - результат с ошибкой написала также выше.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
26.11.2014, 20:11
Цитата Сообщение от jm Посмотреть сообщение
(2 4 2 4 18)
- это вводили?
0
jm
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 19
26.11.2014, 20:19  [ТС]
Catstail, нет, вводила тот же список (task '(1 2 3 4 11 2 3 4 7 23 18 19 11 17)), а (2 4 2 4 18) - уже в ошибке появилось
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
26.11.2014, 20:51
jm, выложите скриншот.

Добавлено через 12 минут
Вот как это работает в 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
CL-USER 1 > (defun remove-d (lst n)
  (cond ((null lst) nil)
        ((> (rem (car lst) n) 0) (remove-d (cdr lst) n))
        (t (cons (car lst) (remove-d (cdr lst) n)))))
 
REMOVE-D
 
CL-USER 2 >  
 
;; главная функция
 
(defun func (lst n res lmax)
 (cond ((> n lmax) res)
       (t (let ((rst (remove-d lst n)))
               (if (null rst)
                   (func lst (+ n 1) res lmax)
                   (func lst (+ n 1) (append res (list rst)) lmax)))))) 
 
FUNC
 
CL-USER 3 >  
 
;; Собственно решение:
 
(defun task (lst)
  (func lst 2 nil (apply '+ lst)))
 
TASK
 
CL-USER 4 > (task '(1 2 3 4 11 2 3 4 7 23 18 19 11 17))
 
((2 4 2 4 18) (3 3 18) (4 4) (18) (7) (18) (11 11) (17) (18) (19) (23))
1
jm
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 19
26.11.2014, 20:57  [ТС]
Прикрепила.
Вот в итоге на autolisp'е получилось - вроде бы работает:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(defun FN (SP)
    (setq M 0 I 2)
    (foreach EL SP (cond ((> EL M) (setq M EL)))
    ) 
    (while (<= I M)
        (setq SP1 ())
        (foreach EL1 SP 
            (if (= (rem EL1 I) 0) (setq SP1 (cons EL1 SP1)))    
        )       
        (setq I (1+ I))  
        (print (reverse SP1))               
    ) 
)
(FN '(1 2 3 4 5 6 5 7 8 10))
Вывод:
(2 4 6 8 10)
(3 6)
(4 8)
(5 5 10)
(6)
(7)
(8)
nil
(10)
Миниатюры
Разбить список на подсписки с элементами, кратными n  
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
26.11.2014, 21:13
Попробуйте вызвать мою функцию так:

Lisp
1
(print (task '(1 2 3 4 11 2 3 4 7 23 18 19 11 17)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.11.2014, 21:13
Помогаю со студенческими работами здесь

Обратить список и все его подсписки на любом уровне
1. Определите функцию, обращающую список и все его подсписки на любом уровне, например, (a b (c d) e) -&gt; (e (d c) b a). Я...

Помогите определить функцию TOTREVERSE которая реверсирует список и его подсписки
Помогите определить функцию TOTREVERSE которая реверсирует список и его. (TOTREVERSE ’(A (B C) D (E) F))) -&gt; (( F (E))D (C B) A))

Создать список на основе исходного, в котором заменить все подсписки на элемент e
Помогите решить задание, не могу въехать совсем Создать список на основе исходного, в котором заменить все подсписки на элемент e.

Разбить список на подсписки
Доброго времени суток! Помогите решить задачу, беспощадная сессия - с Хаскелем еще не разобрался, а экзамен уже через пару дней.. ...

Разбить список на подсписки
собственно сама задача: Список List2 получен из списка List1 путём группировки в подсписки троек элементов, начиная с первого. Если...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru