Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Catstail
Модератор
24289 / 12256 / 2209
Регистрация: 12.02.2012
Сообщений: 19,887
1

Удалить из числового списка числа, нарушающие возрастающий порядок

15.04.2013, 21:58. Просмотров 728. Ответов 7
Метки нет (Все метки)

Задача из раздела "C++ для начинающих". Занятно сравнить длину кода (да и наглядность...). Мое решение:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(defun del-b (lst)
  (cond ((null (cdr lst)) lst)
        ((>= (cadr lst) (car lst)) (cons (car lst) (del-b (cdr lst))))
        (t (del-b (cons (car lst) (cddr lst))))))
 
==> del-b
 
(del-b '(1 2 3 4))
 
==> (1 2 3 4)
 
(del-b '(1 2 3 1 4))
 
==> (1 2 3 4)
 
(del-b '(1 2 3 1))
 
==> (1 2 3)
1
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2013, 21:58
Ответы с готовыми решениями:

Для исходного сложного числового списка, построить список, состоящий из элементов исходного списка, отрицательные числа в котором заменены 0
Для исходного сложного числового списка, построить список, состоящий из элементов исходного списка,...

Удалить элементы массива, нарушающие порядок возрастания
Имеется массив из N элементов (N < 101). Удалите из массива все элементы, нарушающие порядок...

Удалить из строки все слова, нарушающие алфавитный порядок слов
Имя процедуры/функции:DelWordsABC(s) Удалить из строки все слова, нарушающие алфавитный порядок...

Создание числового списка от 1 до заданного конечного числа, пребавляя к предыдущему 1
Форумчане, доброго времени суток! Есть "Выражение1", значение которого изменяется, и которое,...

Удалить из массива все элементы, нарушающие регулярность
Дан целочисленный массив Н(30). Оставить его без изменения, если он упорядочен по невозрастанию или...

7
helter
Эксперт по математике/физике
3820 / 2847 / 307
Регистрация: 12.03.2013
Сообщений: 5,181
15.04.2013, 23:02 2
Вот эта тема?
Удалить из списка неупорядоченные подсписки


Немыслимое для C++ решение:
Lisp
1
2
3
4
5
6
7
(defun del-b (seq)
  (nreverse (reduce #'(lambda (acc x)
                        (if (or (null acc) (> x (car acc)))
                            (cons x acc)
                            acc))
                    seq
                    :initial-value nil)))
1
korvin_
2370 / 1839 / 338
Регистрация: 28.04.2012
Сообщений: 6,387
15.04.2013, 23:07 3
Лучший ответ Сообщение было отмечено как решение

Решение

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(defun cons-b (xs y)
  (if (>= y (car xs)) (cons y xs) xs))
 
(defun rem-b (xs)
  (unless (null xs)
    (nreverse (reduce #'cons-b (cdr xs) :initial-value (list (car xs))))))
 
(rem-b '(1 2 3 4))
; (1 2 3 4)
 
(rem-b '(1 2 3 1 4))
; (1 2 3 4)
 
(rem-b '(1 2 3 1))
; (1 2 3)
Добавлено через 45 секунд
Хах, вот так совпадение. =)
2
helter
Эксперт по математике/физике
3820 / 2847 / 307
Регистрация: 12.03.2013
Сообщений: 5,181
15.04.2013, 23:08 4
korvin_, замечательно хитро вы расправились с пустым списком.
1
_sg
3982 / 3747 / 268
Регистрация: 12.05.2012
Сообщений: 2,621
16.04.2013, 00:23 5
как вариант:
Lisp
1
2
(defun rem-b (xs)
  (when xs (nreverse (reduce #'cons-b (cdr xs) :initial-value (list (car xs))))))
Lisp
1
2
3
4
5
6
(defun del-b (w)
  (if (cdr w)
      (if (<= (car w) (cadr w))
          (cons (car w) (del-b (cdr w)))
          (del-b (cons (car w) (cddr w))))
      w))
1
korvin_
2370 / 1839 / 338
Регистрация: 28.04.2012
Сообщений: 6,387
16.04.2013, 07:54 6
Цитата Сообщение от _sg Посмотреть сообщение
как вариант:
Lisp
1
... (when xs ...
Да, так лучше.
0
_sg
3982 / 3747 / 268
Регистрация: 12.05.2012
Сообщений: 2,621
16.04.2013, 08:30 7
Lisp
1
2
3
4
5
6
7
8
9
(defun drop-deviant (w &optional (b (car w)))
  (cond ((null w) nil)
        ((> b (car w)) (drop-deviant (cdr w) b))
        ((cons (car w) (drop-deviant (cdr w) (car w))))))
 
> (drop-deviant '(1 2 3 4 1))
(1 2 3 4)
> (drop-deviant '(1 2 3 1 4))
(1 2 3 4)
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(defun del (w a)
  (if (< a (car w)) w (cons a w)))
 
(defun del-deviant (w)
  (when w
    (nreverse
     (reduce #'del (cdr w) :initial-value `(,(car w))))))
 
> (del-deviant '(1 2 3 1 4))
(1 2 3 4)
> (del-deviant '(1 2 3 4 1))
(1 2 3 4)
Добавлено через 5 минут
Lisp
1
2
3
4
5
6
7
8
9
(defun del-deviant (w)
  (cond ((null (cdr w)) w)
        ((< (cadr w) (car w)) (del-deviant (cons (car w) (cddr w))))
        ((cons (car w) (del-deviant (cdr w))))))
 
> (del-deviant '(1 2 3 1 4))
(1 2 3 4)
> (del-deviant '(1 2 3 4 1))
(1 2 3 4)
1
Catstail
Модератор
24289 / 12256 / 2209
Регистрация: 12.02.2012
Сообщений: 19,887
16.04.2013, 09:39  [ТС] 8
И итеративное:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(defun del-b (lst)
  (let ((res (list (car lst))))
     (iter (for i in lst) (for j in (cdr lst)) (when (> j i) (collecting j into res)))
     res))
 
 
 
==> del-b
 
(del-b '(1 2 3 1 4 5 2 7))
 
==> (1 2 3 4 5 7)
 
(del-b '(1 2 3 1 1 4 5 2 7))
 
==> (1 2 3 4 5 7)
0
16.04.2013, 09:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2013, 09:39

Предикат, который истинен в том случае, если ни один из элементов числового списка не больше заданного числа
Определить предикат, который истинен в том случае, если ни один из элементов числового списка не...

Удалить все элементы списка, содержащие числа большие, чем среднее значение элементов списка
Сформировать список из N целочисленных случайных элементов (N – вводится пользователем, значения...

Удалить из записи числа цифры 0 и 5, оставив прежним порядок остальных цифр
Дано четырехзначное число n. Удалить из записи числа цифры 0 и 5, оставив прежним порядок остальных...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru