Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38201 / 21133 / 4310
Регистрация: 12.02.2012
Сообщений: 34,740
Записей в блоге: 14

Найти в одноуровневом числовом списке возрастающий подсписок максимальной длины

16.04.2013, 12:01. Показов 1761. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
(Под влиянием предыдущей задачи). Мое решение (ищется первый список):

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
;; Дать длину возрастающей последовательности 
;; с начала списка:
 
(defun len-inc (lst)
  (cond ((null (cdr lst)) 1)
        ((> (cadr lst) (car lst)) (1+ (len-inc (cdr lst))))
        (t 1)))
 
;; Первый возрастающий список максимальной длины:
 
(defun max-len-inc (lst)
 (let* ((lens (maplist #'len-inc lst))
        (m (apply 'max lens))
        (p (position m lens)))
       (subseq lst p (+ p m))))   
 
==> max-len-inc
 
(max-len-inc '(1 2 3 4 1 2 3 4))
 
==> (1 2 3 4)
 
(max-len-inc '(1 2 3 4 1 2 3 4 5 6 2 3))
 
==> (1 2 3 4 5 6)
2
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.04.2013, 12:01
Ответы с готовыми решениями:

Написать функцию, которая находит в данном списке подсписок минимальной длины
Буду очень признателен!

Максимальный возрастающий подсписок
Ребят, помогите пожалуйста! Задание:Построить максимальный растущий подсписок для заданного числового списка. Например, для списка (2 3...

Написать функцию, которая находит в данном списке подсписок минимальной длины. (HomeLisp) - Lisp
Буду очень признателен.

11
 Аватар для _sg
4710 / 4405 / 380
Регистрация: 12.05.2012
Сообщений: 3,102
16.04.2013, 13:46
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(defun seq (w &optional (b (car w)))
  (cond ((null w) nil)
        ((> b (car w)) nil)
        ((cons (car w) (seq (cdr w) (car w))))))
 
(defun maxeq (w &optional ac &aux (v (seq w)))
  (cond ((null w) ac)
        ((> (length v) (length ac)) (maxeq (cdr w) v))
        ((maxeq (cdr w) ac))))
 
> (maxeq '(1 2 3 1 2 3 4 1 2))
(1 2 3 4)
Добавлено через 4 минуты
Lisp
1
2
3
4
5
6
7
8
9
10
(defun seq (w &optional (b (car w)))
  (when w (when (<= b (car w)) (cons (car w) (seq (cdr w) (car w))))))
 
(defun maxeq (w &optional ac &aux (v (seq w)))
  (cond ((null w) ac)
        ((> (length v) (length ac)) (maxeq (cdr w) v))
        ((maxeq (cdr w) ac))))
 
> (maxeq '(1 2 3 1 2 3 4 1 2))
(1 2 3 4)
Добавлено через 1 минуту
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(defun seq (w &optional (b (car w)))
  (when w (when (<= b (car w)) (cons (car w) (seq (cdr w) (car w))))))
 
(defun maxeq (w &optional ac &aux (v (seq w)))
  (if w
      (if  (> (length v) (length ac))
           (maxeq (cdr w) v)
           (maxeq (cdr w) ac))
      ac))
 
> (maxeq '(1 2 3 1 2 3 4 1 2))
(1 2 3 4)
Добавлено через 1 минуту
Lisp
1
2
3
4
5
6
7
8
(defun seq (w &optional (b (car w)))
  (when w (when (<= b (car w)) (cons (car w) (seq (cdr w) (car w))))))
 
(defun maxeq (w &optional ac &aux (v (seq w)))
  (if w (maxeq (cdr w) (if (> (length v) (length ac)) v ac)) ac))
 
> (maxeq '(1 2 3 1 2 3 4 1 2))
(1 2 3 4)
Добавлено через 1 минуту
Lisp
1
2
3
4
5
6
7
8
(defun seq (w &optional (b (car w)))
  (when (and w (<= b (car w))) (cons (car w) (seq (cdr w) (car w)))))
 
(defun maxeq (w &optional ac &aux (v (seq w)))
  (if w (maxeq (cdr w) (if  (> (length v) (length ac)) v ac)) ac))
 
> (maxeq '(1 2 3 1 2 3 4 1 2))
(1 2 3 4)
Добавлено через 6 минут
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
(defun seq (w &optional (b (car w)))
  (when (and w (<= b (car w))) (cons (car w) (seq (cdr w) (car w)))))
 
(defun maxeq (w &optional ac &aux (v (seq w)))
  (if w (maxeq (cdr w) (if  (check v ac) v ac)) ac))
 
(defun check (w v)
  (cond ((null w) nil)
        ((null v) t)
        ((check (cdr w) (cdr v)))))
 
> (maxeq '(1 2 3 1 2 3 4 1 2))
(1 2 3 4)
Добавлено через 1 минуту
Lisp
1
2
3
4
5
6
7
8
9
10
11
(defun check (w v)
  (when w  (if  v (check (cdr w) (cdr v)) t)))
 
(defun seq (w &optional (b (car w)))
  (when (and w (<= b (car w))) (cons (car w) (seq (cdr w) (car w)))))
 
(defun maxeq (w &optional ac &aux (v (seq w)))
  (if w (maxeq (cdr w) (if  (check v ac) v ac)) ac))
 
> (maxeq '(1 2 3 1 2 3 4 1 2))
(1 2 3 4)
3
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38201 / 21133 / 4310
Регистрация: 12.02.2012
Сообщений: 34,740
Записей в блоге: 14
16.04.2013, 14:04  [ТС]
_sg, Да... Снимаю шляпу!
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
16.04.2013, 17:39
У меня получилось длинно и банально, зато экономично (однопроходно).
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
(defun max-len-inc (lst &key (key #'identity) (test #'<=))
  (labels ((foo (lst prev-key cur-list cur-len max-list max-len)
             (if (null lst)
                 (values (nreverse max-list) max-len)
                 (let* ((new-list (rest lst))
                        (cur-key (funcall key (first lst)))
                        (testp (funcall test prev-key cur-key))
                        (new-max-p (and testp (>= cur-len max-len)))
                        (new-cur-list (if testp
                                          (cons (first lst) cur-list)
                                          (list (first lst))))
                        (new-cur-len (if testp
                                         (1+ cur-len)
                                         1))
                        (new-max-list (if new-max-p
                                          new-cur-list
                                          max-list))
                        (new-max-len (if new-max-p
                                         new-cur-len
                                         max-len)))
                   (foo new-list cur-key new-cur-list new-cur-len new-max-list new-max-len)))))
    (if lst
        (foo (rest lst)
             (funcall key (first lst))
             (list (first lst))
             1
             (list (first lst))
             1)
        (values nil 0))))
 
CL-USER> (max-len-inc '(1 2 3 1 2 3 4 1 2))
(1 2 3 4)
4
CL-USER> (max-len-inc '((1 a) (2 b) (3 c d) (1 e) (2 a) (3 x) (4 z) (1) (2)) :key #'car :test #'>=)
((3 C D) (1 E))
2
Хотел засунуть эту хвостовую рекурсию в do - не получилось.
2
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
16.04.2013, 18:38
Цитата Сообщение от helter Посмотреть сообщение
У меня получилось длинно и банально, зато экономично (однопроходно).
...
Хотел засунуть эту хвостовую рекурсию в do - не получилось.
Хм...
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(defun longest-increasing-sublist (xs)
  (let* ((len 1)
         (lst (list (car xs)))
         (max-len len)
         (max-lst lst))
    (dolist (x (cdr xs))
      (cond ((>= x (car lst))
             (push x lst)
             (incf len))
            (t (when (> len max-len)
                 (setf max-len len)
                 (setf max-lst lst))
               (setf len 1)
               (setf lst (list x)))))
    (nreverse (if (> len max-len) lst max-lst))))
 
(longest-increasing-sublist '(1 2 3 1 2 3 4 1 2))
; (1 2 3 4)
3
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
16.04.2013, 18:42
Было функциональное настроение.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
16.04.2013, 19:06
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от helter Посмотреть сообщение
Было функциональное настроение.
Хм... =)
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(defun longest-increasing-sublist/fun (xs)
  (labels ((next (x len lst max-len max-lst)
             (cond ((>= x (car lst)) (list (+ len 1) (cons x lst) max-len max-lst))
                   ((> len max-len)  (list 1 (list x) len lst))
                   (t                (list 1 (list x) max-len max-lst))))
           (last (len lst max-len max-lst)
             (nreverse (if (> len max-len) lst max-lst))))
    (apply #'last (reduce #'(lambda (st x) (apply #'next (cons x st))) (cdr xs)
                          :initial-value (list 1 (list (car xs)) 1 (list (car xs)))))))
 
(longest-increasing-sublist/fun '(1 2 3 1 2 3 4 1 2))
; (1 2 3 4)
3
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
16.04.2013, 21:14
Цитата Сообщение от korvin_ Посмотреть сообщение
Хм... =)
Ой, это очень мне нравится.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38201 / 21133 / 4310
Регистрация: 12.02.2012
Сообщений: 34,740
Записей в блоге: 14
20.02.2015, 20:06  [ТС]
Вот еще одно решение:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(defun max-incr (lst)
  (let ((l (length lst))
        (ll 0)
        (ss 0))
   (iter (for i from 0 to (- l 2))
     (iter (for j from (+ 1 i) to l)
        (let ((test (subseq lst i j))
              (n (- j i)))
           (when (and (apply '< test) (> n ll)) (setq ss test ll n)))))
   ss)) 
 
==> max-incr
 
(max-incr '(1 2 3 2 6 7 8 9 -5 8 12 13))
 
==> (2 6 7 8 9)
 
(max-incr '(1 2 3 2 6 7 8 9 -5 8 12 13 14 15 16 18))
 
==> (-5 8 12 13 14 15 16 18)
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
21.02.2015, 02:21
Хех... Подняли старую тему.
Цитата Сообщение от helter Посмотреть сообщение
Ой, это очень мне нравится.
А я вот, спустя почти два года, смотрю на этот свой код и нифига не могу понять, как он работает, поэтому мне он что-то не очень нравится. =)))
0
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
21.02.2015, 02:37
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
;; racket-lang.org
(define (sawn-list lst p)
  (let loop ((lst lst) (len 1) (acc (list (car lst))))
    (if (or (null? (cdr lst))
            (not (p (car lst) (cadr lst))))
        (values (cdr lst) len acc)
        (loop (cdr lst) (add1 len) (cons (cadr lst) acc)))))
 
 
(define (foo lst #:compare (p <))
  (let loop ((lst lst) (len 0) (acc null))
    (if (null? lst)
        (reverse acc)
        (let-values (((tail sub-list-len sub-list) (sawn-list lst p)))
          (if (> sub-list-len len)
              (loop tail sub-list-len sub-list)
              (loop tail len acc))))))
 
(foo '(1 2 3 1 2 3 4 1 1))
;'(1 2 3 4)
(foo '(1 2 3 1 2 3 4 1 1) #:compare =)
;'(1 1)
Добавлено через 12 минут
Цитата Сообщение от korvin_ Посмотреть сообщение
нифига не могу понять, как он работает
так в реальности же
Lisp
1
(defun foo (...) "описание функции" (тело-с-комментариями))
1
 Аватар для _sg
4710 / 4405 / 380
Регистрация: 12.05.2012
Сообщений: 3,102
21.02.2015, 02:38
Lisp
1
2
3
4
5
6
7
8
9
10
11
(defun check (w v)
  (when w (if v (check (cdr w) (cdr v)) t)))
 
(defun seq (w &optional (b (car w)) &aux (a (car w)))
  (when (and w (<= b a)) (cons a (seq (cdr w) a))))
 
(defun maxeq (w &optional ac &aux (v (seq w)))
  (if w (maxeq (cdr w) (if (check v ac) v ac)) ac))
 
> (maxeq '(1 2 3 1 2 3 4 1 2))
(1 2 3 4)
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.02.2015, 02:38
Помогаю со студенческими работами здесь

Найти в списке чисел заданный последовательный несортированный подсписок
k = 0 with open('input.txt', 'r') as inp: file_list = list_1 = file_list+1] list_2 = file_list+2:file_list+2+file_list+1]] ...

Определить, упорядочены ли элементы в одноуровневом списке, содержащем латинские буквы, по алфавиту
(defun sum-list (x) (cond ((null x) 0) (t (+ (car x) (sum-list (cdr x))))))

Делегаты. Найти строку в двумерном числовом массиве с максимальной суммой элементов
Найти строку в двумерном числовом массиве с максимальной суммой элементов. Модифицировать программу для нахождения строки с минимальной...

Определите функцию (f s), которая в одноуровневом списке чисел s переставляет все отрицательные элементы в начало списка
Определите функцию (f s), которая в одноуровневом списке чисел s переставляет все отрицательные элементы в начало списка, например, (f '(4...

Найти палиндром максимальной длины.
Вариант 7(к.р) 1. Описание функции в Турбо Паскале. 2. Понятие перечисляемого и интервального типов данных. 3. Задача. Дана матрица...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru