Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38176 / 21111 / 4307
Регистрация: 12.02.2012
Сообщений: 34,712
Записей в блоге: 14

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

26.03.2014, 19:54. Показов 1136. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Это - задача из раздела "C для начинающих". Применительно к Haskell, я формулирую ее так:

Дан список целых, в котором ровно один максимум и один минимум (но располагаться они могут где угодно). Вычислить сумму положительных элементов, расположенных между ними (без включения).

Вроде бы, не особо сложная задача. Но оба моих решения как-то не по Haskell-овски громоздки... Как решить изящнее? Мои решения ниже:

Haskell
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
37
38
39
40
41
-- Рекурсия ("за один проход")
 
sum' :: [Int] -> [Int] -> Int -> Int -> Int -> Int -> Int -> Int
sum' [] s i xmin imin xmax imax = (s !! w)-(s !! k)-u-v
                                where k = min imin imax
                                      w = max imin imax
                                      u = if ((imax > imin) && (xmax > 0)) then xmax else 0
                                      v = if ((imin > imax) && (xmin > 0)) then xmin else 0
sum' (x:xs) s i xmin imin xmax imax | (x < xmin) = sum' xs ns (i+1) x i xmax imax
                                    | (x > xmax) = sum' xs ns (i+1) xmin imin x i                                      
                                    | otherwise = sum' xs ns (i+1) xmin imin xmax imax
                                     where ns |(s == []) = if (x > 0) then [x] else [0] 
                                              |(x > 0)   = s++[x + last s] 
                                              | otherwise = s++[last s]
                
solve1 :: [Int] -> Int
solve1 x = sum' x [] 0 w 0 w 0
           where w = head x
 
-- Функционалы
 
pos :: Int -> Int -> [Int] -> Int
pos _ _ [] = -1
pos n k (x:xs) | (n == x) = k
               | otherwise = pos n (k+1) xs
                    
pMax :: [Int] -> Int
pMax x = pos ma 0 x
         where ma = foldl max (head x) x
 
pMin :: [Int] -> Int
pMin x = pos mi 0 x
         where mi = foldl min (head x) x
                    
solve2 :: [Int] -> Int
solve2 x = sum $ map (\ u -> if (u >= 0) then x !! u else 0) z
           where z  = map (\ y -> if ((y <= mi) || (y >= ma)) then -1 else y) [0..(length x)]
                 ma = max pmax pmin
                 mi = min pmax pmin
                 pmax = pMax x
                 pmin = pMin x
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.03.2014, 19:54
Ответы с готовыми решениями:

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

Переписать в обратном порядке элементы вещественного массива, расположенные между минимумом и максимумом
2)Переписать в обратном порядке элементы вещественного массива, расположенные между минимумом и максимумом массива. Все элементы массива...

Продублировать все элементы целочисленного массива, расположенные между максимумом и минимумом массива
Продублировать все элементы целочисленного массива, расположенные между максимумом и минимумом массива.(В тот же массив.)

5
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
26.03.2014, 22:49
Я не понял один момент: минимальный элемент может как предшествовать максимальному, так и послешествовать, так?

Минус этого решение: он 5 раз проходит список.
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
import Data.List(findIndex)
import Data.Maybe(fromJust)
 
index :: [Int] -> Int -> Int
index l e = fromJust $ findIndex (e==) l
 
solve :: [Int] -> Int
solve x = let
  mn = minimum x
  mx = maximum x
  sum1 = sum . takeWhile (<mx) . dropWhile (>mn) $ x
  sum2 = sum . takeWhile (>mn) . dropWhile (<mx) $ x
  in if index x mn < index x mx then sum1 - mn else sum2 - mx
2
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
27.03.2014, 09:35
Два прохода

Haskell
1
2
3
4
5
6
7
8
import Control.Monad
import Control.Monad.Reader
 
minmax xs@( x : _ ) = foldl ( \( a, b ) n -> ( if n < a then n else a, if n > b then n else b ) ) ( x, x ) xs
 
calcSum xs = sum $ takeWhile pred $ tail $ dropWhile pred xs
    where ( min, max ) = minmax xs
          pred = (liftM2 (&&) (/= min) (/= max) )
4
 Аватар для nullxdth
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
27.03.2014, 12:10
Catstail, а эта задача в уютненьком Lisp форуме присутствует?
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38176 / 21111 / 4307
Регистрация: 12.02.2012
Сообщений: 34,712
Записей в блоге: 14
27.03.2014, 12:25  [ТС]
nullxdth, нет... Давайте разместим! разместил
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
29.03.2014, 20:47
Цитата Сообщение от Catstail Посмотреть сообщение
Вроде бы, не особо сложная задача. Но оба моих решения как-то не по Haskell-овски громоздки... Как решить изящнее?
Несложная. 12 строк. 1 проход.
Code
1
2
3
4
5
6
7
8
9
10
11
12
let sumMinMax xs =  
    let rec noNeg xs = match xs with h :: t when h < 0 -> noNeg t | xs -> xs
    let rec loop minx maxx accmin accmax accfull = 
        function
        | []                    -> abs (accmax - accmin) - if accmin  > accmax then minx else maxx
        | h :: t when h < 0     -> t |> loop minx maxx accmin accmax accfull
        | h :: t when h < minx  -> t |> loop h maxx (accfull + h) accmax (accfull + h)
        | h :: t when h > maxx  -> t |> loop minx h accmin (accfull + h) (accfull + h)
        | h :: t                -> t |> loop minx maxx accmin accmax (accfull + h)
    match noNeg xs with 
    | a :: t -> loop a -1 0 0 a t
    | _      -> 0
Не Haskell, но проблем с переводом быть не должно, т.к. никаких библиотек не используется
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.03.2014, 20:47
Помогаю со студенческими работами здесь

Обнулить элементы между минимумом и максимумом
Добрый вечер. Пытаюсь обнулить элементы в массиве, которые находятся между min и max элементами.Выдает ошибку, ругается на fill. Что делаю...

Заменить в массиве элементы между минимумом и максимумом нулями
В массиве А(3,4) заменить на 0 элементы между min и max элементами

Отсортировать элементы одномерного массива между минимумом и максимумом
Отсортировать элементы одномерного массива между минимумом и максимумом в порядке возрастания.

В массиве обнулить все элементы, стоящие между максимумом и минимумом
В массиве обнулить все элементы, стоящие между максимумом и минимумом. и так же проверить работает ли программа в случае, когда массив...

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
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