Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,710
Записей в блоге: 14

Интересная задача с сайта lisp.ru: заменить в списке положительные числа ближайшим отрицательным (справа или слева)

31.01.2013, 20:30. Показов 1208. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дан одноуровневый числовой список. Нужно заменить каждое положительное число ближайшим отрицательным справа или слева.
Если нет отрицательных - заменять на nil.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.01.2013, 20:30
Ответы с готовыми решениями:

Переставить числа в массиве, чтобы слева от границы стояли числа, меньшие или равные b, а справа большие
Дан массив a и число b. Переставить числа в массиве таким образом, чтобы слева от некоторой границы стояли числа, меньшие или равные b, а...

Определить, сколько в массиве Z имеется положительных чисел, окруженных слева и справа по крайней мере одним отрицательным числом
Определить, сколько в массиве Z имеется положительных чисел, окруженных слева и справа по крайней мере одним отрицательным числом. Вывести...

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

6
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
31.01.2013, 21:04
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
(defun negative-positions (xs)
  (loop :for x :in xs
        :for i :upfrom 0
        :when (< x 0)
        :collect (cons i x)))
 
(defun find-nearest (i indexed-list)
  (when indexed-list
    (do ((ys indexed-list (cdr ys)))
        ((null (cdr ys)) (cdar indexed-list))
      (destructuring-bind ((j1 . y1) (j2 . y2) &rest _) ys
        (declare (ignore _))
        (when (< j1 i j2)
          (return-from find-nearest
            (if (< (- i j1)
                   (- j2 i))
                y1 y2)))))))
 
(defun replace-positive-by-nearest-negative-or-null (xs)
  (let ((nps (negative-positions xs)))
    (loop :for x :in xs
          :for i :upfrom 0
          :collect (if (> x 0) (find-nearest i nps) x))))
 
(defun test-one (list)
  (format t "~&## ~{~4d~}~%-> ~{~4d~}~%~%" list 
          (replace-positive-by-nearest-negative-or-null list))
  (values))
 
(defun test ()
  (test-one '(1 2 3 4))
  (test-one '(-1 1 2 -2 3 4 5 6 -6)))
=>
Lisp
1
2
3
4
5
6
7
8
9
CL-USER 4 > (test)
##    1   2   3   4
->  NIL NIL NIL NIL
 
##   -1   1   2  -2   3   4   5   6  -6
->   -1  -1  -2  -2  -2  -2  -6  -6  -6
 
 
CL-USER 5 >
если я правильно понял задачу.
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,710
Записей в блоге: 14
31.01.2013, 21:34  [ТС]
Мое решение (не слишком рациональное):

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
;; Поиск пары ближайших отрицательных
 
(defun pair-neg (lst n &optional left right (c 0))
  (cond ((null lst) (list left right))
        ((< c n)
         (cond ((< (car lst) 0) (pair-neg (cdr lst) n (list c (car lst)) right (+ c 1)))
               (t (pair-neg (cdr lst) n left right (+ c 1)))))
        ((= c n) (pair-neg (cdr lst) n left right (+ c 1)))
        (t (cond ((< (car lst) 0) (list left (list c (car lst))))
                 (t (pair-neg (cdr lst) n left right (+ c 1)))))))
 
;; вычисление ближайшего отрицательного
 
(defun nneg (lst k)
  (cond ((And (null (car lst)) (null (cadr lst))) Nil)
        ((null (car lst)) (cadr (cadr lst)))
        ((null (cadr lst)) (cadr (car lst))) 
        (t (let ((p1 (caar lst))
                 (q1 (cadar lst))
                 (p2 (car (cadr lst)))
                 (q2 (cadr (cadr lst))))
                 (if (< (- k p1) (- p2 k)) q1 q2)))))
 
;; решение
 
(defun solve (lst &optional (c 0) (sav lst))
  (cond ((null lst) nil)
        ((< (car lst) 0) (cons (car lst) (solve (cdr lst) (+ c 1) sav)))
        (t (cons (nneg (pair-neg sav c) c) (solve (cdr lst) (+ c 1) sav)))))
 
==> solve
 
(solve '( 1 -2 3 -4 -5 6 7 8))
 
==> (-2 -2 -4 -4 -5 -5 -5 -5)
0
 Аватар для _sg
4709 / 4404 / 380
Регистрация: 12.05.2012
Сообщений: 3,101
01.02.2013, 10:14
Lisp
1
2
3
4
5
6
7
8
9
10
11
(defun neighbors (w &optional ac &aux (a (car w)) (d (cdr w)))
  (cond ((null w) nil)
        ((plusp a) (if (some #'minusp d)
                       (cons (find-if #'minusp d) (neighbors d ac))
                       (if (some #'minusp ac)
                           (cons (find-if #'minusp ac) (neighbors d ac))
                           (cons nil (neighbors d ac)))))
        ((cons a (neighbors d (cons a ac))))))
 
> (neighbors '( 1 -2 3 -4 -5 6 7 8))
(-2 -2 -4 -4 -5 -5 -5 -5)
Lisp
1
2
3
4
5
6
7
8
9
10
11
(defun neighbors (w &optional ac &aux (a (car w)) (d (cdr w)))
  (when w (if (plusp a)
              (if (some #'minusp d)
                  (cons (find-if #'minusp d) (neighbors d ac))
                  (if (some #'minusp ac)
                      (cons (find-if #'minusp ac) (neighbors d ac))
                      (cons nil (neighbors d ac))))
              (cons a (neighbors d (cons a ac))))))
 
> (neighbors '( 1 -2 3 -4 -5 6 7 8))
(-2 -2 -4 -4 -5 -5 -5 -5)
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,710
Записей в блоге: 14
01.02.2013, 10:48  [ТС]
Гм... Ваше решение заменяет положительные числа ближайшим отрицательным справа:

Lisp
1
2
CL-USER 3 > (neighbors '( 1 -2 3 -4 -5 6 7 7 7 -2 8))
(-2 -2 -4 -4 -5 -2 -2 -2 -2 -2 -2)
тогда, как в условии нужно определять для каждгого положительного ближайшее отрицательное справа и слева:

Lisp
1
2
3
(solve '( 1 -2 3 -4 -5 6 7 7 7 -2 8))
 
==> (-2 -2 -4 -4 -5 -5 -5 -2 -2 -2 -2)
0
 Аватар для _sg
4709 / 4404 / 380
Регистрация: 12.05.2012
Сообщений: 3,101
01.02.2013, 12:35
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(defun mi (w) (find-if #'minusp w))
 
(defun neighbors (w &optional ac &aux (a (car w)) (d (cdr w)))
  (when w
    (if (plusp a)
        (cond ((and (some #'minusp ac) (some #'minusp d))
               (if (< (position-if #'minusp ac) (position-if #'minusp d))
                   (cons (mi ac) (neighbors d (cons a ac)))
                   (cons (mi d) (neighbors d (cons a ac)))))
              ((some #'minusp d) (cons (mi d) (neighbors d (cons a ac))))
              ((some #'minusp ac) (cons (mi ac) (neighbors d (cons a ac))))
              ((cons nil (neighbors d (cons a ac)))))
        (cons a (neighbors d (cons a ac))))))
 
> (neighbors '(1 -2 3 -4 -5 6 7 7 7 -2 8))
(-2 -2 -4 -4 -5 -5 -5 -2 -2 -2 -2)
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(defun mi (w) (find-if #'minusp w))
 
(defun sm (w) (some #'minusp w))
 
(defun ps (w) (position-if #'minusp w))
 
(defun ne (w a v) (neighbors w (cons a v)))
 
(defun neighbors (w &optional ac &aux (a (car w)) (d (cdr w)))
  (when w (if (plusp a)
              (cond ((and (sm ac) (sm d))
                     (if (< (ps ac) (ps d))
                         (cons (mi ac) (ne d a ac))
                         (cons (mi d) (ne d a ac))))
                    ((sm d) (cons (mi d) (ne d a ac)))
                    ((sm ac) (cons (mi ac) (ne d a ac)))
                    ((cons nil (ne d a ac))))
              (cons a (ne d a ac)))))
 
> (neighbors '(1 -2 3 -4 -5 6 7 7 7 -2 8))
(-2 -2 -4 -4 -5 -5 -5 -2 -2 -2 -2)
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,710
Записей в блоге: 14
01.02.2013, 12:54  [ТС]
Итерационное решение:

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
;; список позиций отрицательных
 
(defun pos-neg (lst)
 (let ((lstn nil))
   (iter (for i in lst) (for c from 0 to (- (length lst) 1))
         (when (< i 0) (collecting c into lstn)))
   lstn
 ))
 
;; Ближайшее отрицательное
 
(defun nearest-neg (p lstneg)
  (cond ((< p (car lstneg)) (car lstneg))
        ((> p (last lstneg)) (last lstneg))
        (t (iter (for i in lstneg) (for j in (cdr lstneg)) 
                 (when (and (> p i) (< p j)) 
                       (return (if (< (- p i) (- j p)) i j)))))))
 
;; Решение:
 
(defun solve (lst)
  (let ((posneg (pos-neg lst)) (res nil))
    (iter (for c in lst) (for i from 0 to (- (length lst) 1))
        (if (< c 0) (collecting c into res)
                    (collecting (car (subseq lst (nearest-neg i posneg))) into res)))
    res))
    
 
==> solve
 
(solve '(1 -2 3 -4 -5 6 7 7 7 -2 8))
 
==> (-2 -2 -4 -4 -5 -5 -5 -2 -2 -2 -2)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.02.2013, 12:54
Помогаю со студенческими работами здесь

Переставить элементы массива так, чтобы слева подряд были записаны отрицательные, а справа положительные
Даны массивы A , B , C . Переставить элементы в них таким образом, чтобы слева подряд были записаны отрицательные, а справа положительные,...

Найти место в самолёте (первый или второй салон, слева или справа)
Private Sub CommandButton1_Click() Dim M, N, M1, N1, M0 As Integer M = TextBox1.Value 'общее количество рядов N = TextBox2.Value...

Sidebar и footer сайта находятся слева а не справа и внизу
Добрый день! Помогите советом. Делаю верстку сайта по образцу - сверил с исходником - все совпадает. Есть два файла index.html и...

Замостить боковые полосы сайта слева и справа разными картинками
Доброго времени суток, уважаемые товарищи. У меня возникла проблема с замосткой двух разных рисунков по краям сайта. Нужно один разместить...

Справа и слева от отрицательного числа поставить числа, равные последнему элементу массива
как справа и слева от отрицательного числа поставить числа равные последнему элементу массива?


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru