Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
2 / 2 / 0
Регистрация: 05.05.2017
Сообщений: 91
1

Написать программу, которая получает список из списков из списков чисел

05.05.2017, 19:08. Показов 2326. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет,
мне нужно написать программу, которая получает список из списков из списков чисел, [[[1,2],[3,4]],[[5,6],[7,8]],[[10,11],[12,13]]] примерно так , и потом суммирует самые внутренние списки. Tо есть получим 10, 26, 46 , а потом выкидаем из списка списки, у которых сумма меньше или равна 20 и переворачиваем список. Итого получим [46,26].

Я начинающий программист, кто-то может помочь с написанием программы?

Моя идея:
Haskell
1
2
3
4
5
listfunction:: [[[Int]]] ->[[Int]]->[Int] -> [Int]
listfunction [[[]]] =[]
listfunction (((x: xs))) = x+xs: listfunktion (xs)
listfunktion (x: xs) = if x <=20 then 0 else x+xs
listfunktion (x:xs) = x: reverse xs
Что нужно изменить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.05.2017, 19:08
Ответы с готовыми решениями:

Написать программу, которая создает список из n раз повторенных списков
Всем доброго времени суток. Нужна помощь с выполнением задания Напишите функцию от двух...

Список списков списков чисел
Всем привет) Задание: l1 - список списков списков чисел. Необходимо получить список чисел l2,...

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

Clojure Реализовать функцию, которая из двух списков, состоящих из чисел, строит список из парных разностей
Реализовать функцию, которая из двух списков, состоящих из чисел, строит список из парных...

20
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
05.05.2017, 19:42 2
Лучший ответ Сообщение было отмечено Ellie Tetka как решение

Решение

Haskell
1
2
3
4
5
6
solve :: [[[Int]]] -> [Int]
solve lst =
        reverse $ filter (\x -> x > 20) $ map sumIntern lst
            where sumIntern l = sum $ map sum l
 
main = print $ solve [[[1,2],[3,4]],[[5,6],[7,8]],[[10,11],[12,13]]]
3
2 / 2 / 0
Регистрация: 05.05.2017
Сообщений: 91
05.05.2017, 19:47  [ТС] 3
Цитата Сообщение от Max Dark Посмотреть сообщение
1
2
3
4
5
6
solve :: [[[Int]]] -> [Int]
solve lst =
* * * * reverse $ filter (\x -> x > 10) $ map sumIntern lst
* * * * * * where sumIntern l = sum $ map sum l
main = print $ solve [[[1,2],[3,4]],[[5,6],[7,8]],[[10,11],[12,13]]]
Ух ты это реально работает!!!
Вы не могли бы мне объяснить построчно, как это работает???

Это случайно не patter matching?
что такое patter matching..? его нельзя использовать в этом задании...
0
431 / 302 / 89
Регистрация: 03.12.2015
Сообщений: 738
05.05.2017, 20:06 4
Лучший ответ Сообщение было отмечено Max Dark как решение

Решение

Haskell
1
listfunction xs = reverse $ filter (>20) $ map (sum . concat) xs
Исходный список xs имеет три элемента:
[
[[1,2],[3,4]],
[[5,6],[7,8]],
[[10,11],[12,13]]
]

map (sum.concat) xs берет каждый элемент, объединяется все элементы в нем, и затем суммирует
concat [[1,2],[3,4]] = [1,2,3,4]
sum [1,2,3,4] = 10
После обработки всех трех элементов получается список [10,26,46]
Затем отбираются числа > 20 с помощью filter (>20)
Затем список переворачивается с помощью reverse

Если непонятно:
map (sum.concat) то же, что и map (\lst -> sum $ concat lst)
filter (>20) то же, что и filter (\x -> x > 20)
4
2 / 2 / 0
Регистрация: 05.05.2017
Сообщений: 91
05.05.2017, 20:08  [ТС] 5
Цитата Сообщение от vrm2 Посмотреть сообщение
map (sum.concat) то же, что и map (\lst -> sum $ concat lst)
Ясно, а что такое Ils ?
и что такое \ ?
0
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
05.05.2017, 20:31 6
Цитата Сообщение от Ellie Tetka Посмотреть сообщение
как это работает???
map проходится по списку и вызывает для каждого элемента функцию sunIntern, объявленную в where, затем filter отбирает элементы > 20 и reverse переворачивает результат отбора
функция sunIntern суммирует списки используя map для сложения элементов подсписков.
Цитата Сообщение от Ellie Tetka Посмотреть сообщение
Это случайно не patter matching?
нет, это просто цепочка функций.
Цитата Сообщение от Ellie Tetka Посмотреть сообщение
что такое patter matching..?
совпадение по шаблону - выбор реализации функции в зависимости от значения параметров - например, в вашем коде он использовался.
Цитата Сообщение от Ellie Tetka Посмотреть сообщение
а что такое Ils ?
lst - имя параметра
Цитата Сообщение от Ellie Tetka Посмотреть сообщение
и что такое \ ?
Означает, что дальше пойдет lambda-функция
3
2 / 2 / 0
Регистрация: 05.05.2017
Сообщений: 91
05.05.2017, 20:35  [ТС] 7
Цитата Сообщение от Max Dark Посмотреть сообщение
Означает, что дальше пойдет lambda-функция
Спасибо!
так, не правильно задала вопрос, название функции мне уже известно, что делает лямбда функция...?
0
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
05.05.2017, 20:36 8
https://ru.wikipedia.org/w/ind... n_matching
https://ru.wikipedia.org/wiki/... 0%B8%D1%8F
1
2 / 2 / 0
Регистрация: 05.05.2017
Сообщений: 91
05.05.2017, 20:42  [ТС] 9
Цитата Сообщение от Max Dark Посмотреть сообщение
reverse $ filter (\x -> x > 20) $ map sumIntern lst
* * * * * * where sumIntern l = sum $ map sum l
А возможно ли решение без map? Как тогда пройти по каждому элементу?
0
Модератор
5047 / 3276 / 526
Регистрация: 01.06.2013
Сообщений: 6,806
Записей в блоге: 9
05.05.2017, 21:15 10
Лучший ответ Сообщение было отмечено Max Dark как решение

Решение

Цитата Сообщение от Ellie Tetka Посмотреть сообщение
А возможно ли решение без map?
Можно его спрятать
Haskell
1
2
task :: [[[Int]]] -> [Int]
task lst = reverse [x|x<-[sum $ concat l|l<-lst],x>20]
Можно, конечно, явной рекурсией, примерно как вы в начале пытались сделать, но это длинно. map для того и предназначена.

Добавлено через 5 минут
Собственно, вот как реализована сама map в базовом пакете (о есть, та, что использована в примерах выше):
Haskell
1
2
3
map :: (a -> b) -> [a] -> [b]
map _ []     = []
map f (x:xs) = f x : map f xs
2
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
05.05.2017, 21:16 11
Цитата Сообщение от Ellie Tetka Посмотреть сообщение
А возможно ли решение без map?
Можно, но тогда потребуется pattern matching - map использует его внутри
Цитата Сообщение от Ellie Tetka Посмотреть сообщение
Как тогда пройти по каждому элементу?
примерная замена для map
Haskell
1
2
3
4
5
6
mymap::(a -> b) -> [a] -> [b]
mymap _ [] = [] -- map от пустого списка - пустой список
mymap f (x:xs) = [f x] ++ mymap f xs -- иначе map вызывает функцию f для "головы" списка и себя для "хвоста".
                                     -- результаты образует новый список.
 
main = print $ mymap (+1) [1, 2, 3]
P.S.: Почитайте "О Haskell по-человечески"
2
2 / 2 / 0
Регистрация: 05.05.2017
Сообщений: 91
05.05.2017, 21:26  [ТС] 12
Спасибо Вам Огромное!!!
0
650 / 260 / 16
Регистрация: 02.03.2014
Сообщений: 587
06.05.2017, 12:16 13
Цитата Сообщение от Max Dark Посмотреть сообщение
Haskell
1
mymap f (x:xs) = [f x] ++ mymap f xs
За такое нужно бить по рукам...
Haskell
1
mymap f (x:xs) = f x : mymap f x
1
2 / 2 / 0
Регистрация: 05.05.2017
Сообщений: 91
06.05.2017, 14:32  [ТС] 14
Цитата Сообщение от Araneo Посмотреть сообщение
За такое нужно бить по рукам...
Почему, в чем же разница..?
0
650 / 260 / 16
Регистрация: 02.03.2014
Сообщений: 587
06.05.2017, 14:37 15
Если не считать, что мой вариант считается за o(n), а твой за o(n^2), то никакой...
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,645
Записей в блоге: 13
06.05.2017, 17:09 16
Небольшое обобщение (20 - число, ничем не выделяющееся):

Haskell
1
2
3
4
5
6
7
8
9
10
11
task x n = reverse $ filter (>= n) tmp 
              where tmp = map sum $ map concat x
 
Main> task [[[1,2],[3,4]],[[5,6],[7,8]],[[10,11],[12,13]]] 20
[46,26]
Main> task [[[1,2],[3,4]],[[5,6],[7,8]],[[10,11],[12,13]]] 30
[46]
Main> task [[[1,2],[3,4]],[[5,6],[7,8]],[[10,11],[12,13]]] 40
[46]
Main> task [[[1,2],[3,4]],[[5,6],[7,8]],[[10,11],[12,13]]] 50
[]
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
06.05.2017, 18:44 17
Цитата Сообщение от Araneo Посмотреть сообщение
За такое нужно бить по рукам...
А мне кажется, наоборот, надо бить по мозгам за такие категоричные непроверенные утверждения. Из серии "слышал звон". Конкатенация в хвост списку из одного элемента - это О(1) как по времени так и по памяти. И ничем не отличается от конса в голову. Я вообще не удивлюсь, если оба варианта дадут одинаковый коре или ассемблерный код.
0
650 / 260 / 16
Регистрация: 02.03.2014
Сообщений: 587
06.05.2017, 19:13 18
Цитата Сообщение от _Ivana Посмотреть сообщение
Бить по мозгам за такие категоричные непроверенные утверждения. Из серии "слышал звон".
Скажем так, какое-то время назад такая проблема реально была... сейчас такой код действительно собирается нормально (я посмотрел в какую сторону ассоциативность). Но всё-таки с конкатенацией нужно быть осторожным :-)
0
Curry
06.05.2017, 19:25
  #19

Не по теме:

Цитата Сообщение от Araneo Посмотреть сообщение
нужно бить по рукам...
Цитата Сообщение от _Ivana Посмотреть сообщение
надо бить по мозгам
Цитата Сообщение от _Ivana Посмотреть сообщение
И ничем не отличается от конса в голову.
При беглом чтении впечатление что это конфа то ли по реслингу, то ли по файтингу какому то. %-) :black_eye.:

0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
06.05.2017, 23:44 20
Araneo, проблема может случиться (и то не всегда, надо смотреть контекст) при конкатенации в хвост длинного или возрастающего списка. Здесь же просто криво записанный конс - оборачиваем элемент в список длиной 1 и консим к нему в хвост. Даже если не будет оптимизаций компилятора, асимптотика будет той же, ну может потеряем пару тактов на заворачивание/разворачивание. Могу замерить различия на своем языке - у меня точно нет оптимизатора

Не по теме:

KolodeznyDiver, ну если у вас "конс в голову" в сложившемся вокруг него контексте ассоциируется в "маваши-гери дзё дан", то я стесняюсь даже написать, с чем должно ассоциироваться "накопительная конкатенация в хвост" :-[

0
06.05.2017, 23:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2017, 23:44
Помогаю со студенческими работами здесь

Объединение 2 и более списков в список списков по индексу без использования циклов
Уважаемые товарищи, подскажите есть ли способ объединения 2 и более списков в список списков по...

Копирование данных двумерного массива состоящего из списков в список списков.
Для нахождения МСТ (минимального остового дерева) написал функцию, которая принимает масив - гарф....

Как из двух списков сделать один список кортежей/списков
Доброго времени суток! Буду очень благодарен, если поможете из двух списков, к примеру a и b,...

Список списков после добавления списков остается пустым
Здравствуйте имеется код: def lookup_main_url(driver): subjects = .... for county...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru