Модератор
Эксперт функциональных языков программированияЭксперт Python
30647 / 16874 / 3476
Регистрация: 12.02.2012
Сообщений: 28,285
Записей в блоге: 5
1

Еще одна задача из раздела "Fortran"

15.09.2013, 20:13. Показов 757. Ответов 5
Метки нет (Все метки)

В списке целых найти максимальную последовательность чисел одного знака.

Мое решение:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
sign :: Int -> Int   -- не нашел стандартной функции...
sign n | (n == 0) = 0
       | (n <  0) = -1
       | otherwise = 1
       
maxSeq :: [Int] -> [Int] -> [Int] -> [Int]
maxSeq [] c r = if ((length c) > (length r)) then c else r
maxSeq (x:xs) [] r = maxSeq xs [x] r 
maxSeq (x:xs) inic@(c:cs) r | ((sign x) == (sign c)) = maxSeq xs (inic ++ [x]) r
                            | otherwise = if ((length inic) > (length r)) then
                                             maxSeq xs [x] inic
                                          else
                                             maxSeq xs [x] r
Правильно?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.09.2013, 20:13
Ответы с готовыми решениями:

Задача из раздела "Fortran" - по заданной квадратной матрице (n*n) построить двоичный вектор размерности n
i-я компонента вектора = 1, если сумма строки i больше суммы столбца i. Иначе компонента = 0. ...

Задача из раздела "Fortran"
В списке записаны элементы верхнего треугольника квадратной матрицы по столбцам. Построить список,...

Задача из раздела "Алгебра и терия чисел"
Вот ссылка https://www.cyberforum.ru/algebra/thread887245.html А вот моя попытка решения (на...

Задача из раздела "С для начинающих"
В строку записаны цифры 1 10 100 1000 (т.е. последовательные степени 10). Для заданной позиции k...

5
163 / 163 / 22
Регистрация: 23.02.2011
Сообщений: 347
15.09.2013, 22:26 2

Не по теме:

стандартная функция signum



Добавлено через 16 минут
Haskell
1
2
3
4
5
6
7
8
9
subSeq [] = []
subSeq l@(h:t) = take q (drop sp l)
    where
        (sp,q) = loop t (signum h) 1 0 1 (0,1)
        loop [] _ _ pos q a@(p',q') = if q' >= q then a else (pos,q)
        loop (h:t) zn curPos pos q ac
            | signum h == zn = loop t zn (curPos+1) pos (q+1) ac
            | otherwise = loop t (-zn) (curPos+1) curPos 1 newAcc
            where newAcc = if snd ac >= q then ac else (pos,q)
Добавлено через 4 минуты
Строить списки всех возможных вариантов и считать их длины на каждом ходу - довольно сложно. Лучше бежать по последовательности, сохраняя позицию, длину и знак текущей и самой большой последовательности, тогда в случае смены знака, сравниваются уже посчитаные длины. Плюс списки не перестраиваются.
1
Эксперт С++
5820 / 3472 / 357
Регистрация: 08.02.2010
Сообщений: 7,448
16.09.2013, 08:22 3
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
import Data.List (groupBy, maximumBy)
import Data.Function (on)
import Data.Ord (comparing)
import Control.Arrow ((&&&))
 
groupBySign :: (Num a, Eq a) => [a] -> [[a]]
groupBySign = groupBy ((==) `on` signum)
 
maxSequenceByLength :: [[a]] -> [a]
maxSequenceByLength = fst . maximumBy (comparing snd) . map (id &&& length)
 
maxSubsequenceOfSameSign :: (Num a, Eq a) => [a] -> [a]
maxSubsequenceOfSameSign = maxSequenceByLength . groupBySign
Можно было и в одну строчку написать, но так читается лучше + отдельные функции легче повторно использовать.
1
Эксперт по математике/физике
4156 / 2059 / 424
Регистрация: 19.07.2009
Сообщений: 3,117
Записей в блоге: 24
16.09.2013, 10:25 4
Haskell
1
2
3
sameSign = on (==) signum
length' = on compare length
maxSeq = maximumBy length' . groupBy sameSign
P.S. впрочем, получается примерно как у Nameless One
2
Модератор
Эксперт функциональных языков программированияЭксперт Python
30647 / 16874 / 3476
Регистрация: 12.02.2012
Сообщений: 28,285
Записей в блоге: 5
16.09.2013, 10:37  [ТС] 5
Цитата Сообщение от Algiz Посмотреть сообщение
Не по теме:
стандартная функция signum
- отдельное спасибо!

И общее спасибо всем.

Добавлено через 1 минуту
Цитата Сообщение от Algiz Посмотреть сообщение
Строить списки всех возможных вариантов и считать их длины на каждом ходу - довольно сложно.
- а я так и не делаю...
0
Эксперт С++
5820 / 3472 / 357
Регистрация: 08.02.2010
Сообщений: 7,448
16.09.2013, 11:53 6
Цитата Сообщение от Mysterious Light Посмотреть сообщение
P.S. впрочем, получается примерно как у Nameless One
Только я с maxSequenceByLength чего-то намудрил…
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.09.2013, 11:53

Задача из раздела "Паскаль"
Найти минимальное натуральное число, не представимое в виде суммы элементов заданного списка целых...

Задача о "Ханойских башнях" на Haskell
Добрый день! Помогите, пожалуйста, реализовать алгоритм решения задачи &quot;Ханойские башни&quot; на языке...

[КуМир] Ввести символьную строку и заменить все буквы "а" на "б" и наоборот (как заглавные так и строчные)
ввести символьную строку и заменить все буквы а на буквы б и наоборот как заглавные так и строчные...

Функция для нахождения "Наибольшего общего делителя" и "Наименьшего общего кратного"
Помогите пожалуйста!!!!СРОЧНО НАДО!! Нужно написать функцию для нахождения НОД(наибольшего общего...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru