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

Простая задача из раздела C++: удалить те элементы списка, значение которых меньше числа их вхождений в список

02.01.2015, 10:53. Показов 1169. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мое решение:

Haskell
1
2
3
task :: [Int] -> [Int]
task x = map fst $ filter (\ z -> (snd z) > (fst z)) (map (\ y -> (y , count y x)) x)
         where count p = foldl (\ acc y -> if (y==p) then acc+1 else acc) 0
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.01.2015, 10:53
Ответы с готовыми решениями:

Удалить элементы, значение которых меньше среднего значения всех элементов массива
удалить элементы, значение которых меньше среднего значения всех элементов массива с помощь динамических массивов, помогите. Я явно что-то...

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

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

14
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,551
Записей в блоге: 9
02.01.2015, 12:29
Haskell
1
2
3
task:: [Int] -> [Int] 
task x = let f= map head $ filter (\v -> head v >= length v) $ group $ sort x
         in filter (`elem` f) x
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
02.01.2015, 12:59
Haskell
1
task l = filter (flip elem s) l where s = map fst.filter(\(x,l)->x>=l).map(\x->(head x, length x)).group.sort $ l
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38177 / 21112 / 4307
Регистрация: 12.02.2012
Сообщений: 34,716
Записей в блоге: 14
02.01.2015, 14:18  [ТС]
KolodeznyDiver, _Ivana, сопоставимо... но не без ртути из градусников (изюма из булок).
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
02.01.2015, 17:34
Catstail, я тоже это заметил, но честно писал сам, не подглядывая в предыдущего кота Разумеется всё в изюме и градусниках, это первый уровень на котором я пытаюсь думать. Если не получается - переключаюсь на "ручной" режим написания. И еще в данный период мне нравится нанизывать много функций последовательно через композицию, чем и балуюсь
0
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,551
Записей в блоге: 9
02.01.2015, 17:47
Цитата Сообщение от _Ivana Посмотреть сообщение
Разумеется всё в изюме и градусниках

Не по теме:

Не оправдывайтесь! Изюм из градусников - это правильно!

На codewars-е появились новые каты, но в них полно ошибок. И неправильно тестируют, и даже сигнатуру ф-ии предлагают неправильную. :(

0
 Аватар для Araneo
650 / 260 / 16
Регистрация: 02.03.2014
Сообщений: 587
04.01.2015, 00:48
Используя, свою же наработку из соседней темы.
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import Prelude hiding (lookup)  
import Data.Map hiding (foldl,filter)
 
task :: (Num a, Ord a) => [a] -> [a]
task l = foldl (\acc (i,n) ->
    if i > n then acc else filter (/=i) acc
    ) l (calculate l)
 
calculate :: (Ord element, Num numberOfElements) => 
    [element] -> [(element, numberOfElements)]
calculate = toList.foldl (\acc x ->
    case x`lookup`acc of
        Nothing -> insert x 1 acc
        Just i  -> insert x (i + 1) acc
    ) empty
Только сейчас до меня дошло, почему я раньше не использовал, говорящие имена в типовых переменных, почему... я же и раньше воспринимал тип функции как комментарий. Нужный скорее мне чем компилятору... почему ленился там где этого не следовало делать. Что за идиотизм... Прошу прощения, за эту минутку самокопания...
1
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,551
Записей в блоге: 9
04.01.2015, 03:06
Цитата Сообщение от Araneo Посмотреть сообщение
import Prelude hiding (lookup) *
import Data.Map hiding (foldl,filter)
Во "взрослых" программах редко прячут дублирующиеся в модулях функции.
Haskell
1
import qualified Data.Map as M
И тогда M.toList, `M.lookup`. А точку как функцию композиции принято отделять пробелами, т.е. M.toList . foldl.

Цитата Сообщение от Araneo Посмотреть сообщение
я же и раньше воспринимал тип функции как комментарий. Нужный скорее мне чем компилятору
Сигнатуру функции писАть надо, чтобы больше ошибок в compile-time выявлять. Ну и для самодокументации не помешает. Это, тут, на форуме некоторые (и я грешен) не пишут.
0
 Аватар для smoke853
505 / 511 / 42
Регистрация: 12.12.2013
Сообщений: 484
04.01.2015, 06:18
Haskell
1
2
3
4
5
import qualified Data.IntMap as IM
 
task :: [Int] -> [Int]
task lst = filter (`IM.notMember` del lst) lst
  where del = IM.filterWithKey (<) . foldr (\x -> IM.insertWith (+) x 1) IM.empty
2
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
04.01.2015, 09:02
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Сигнатуру функции писАть надо, чтобы больше ошибок в compile-time выявлять. Ну и для самодокументации не помешает. Это, тут, на форуме некоторые (и я грешен) не пишут.
Возлагать на программиста то, что может и должен делать компилятор, выглядит как дурной тон. Особенно странно выглядит, когда это ещё выдаётся за хорошую практику, позволяющую по-больше ошибок в compile-time выявить, будто бы не следуя которой человек грешит по лени. Ошибки выявляются и так хорошо, поскольку наиболее общий тип каждого терма выводится автоматически.

Писать тип, когда его позволительно не писать, нужно только в двух случаях:
1. В функции коментария, о чём было сказано ранее.
2. Из-за несовершенства языка (например, когда компилятор не в состоянии вывести, что одна из букв в полиморфном типе имеет какие-то классовые ограничения)

Таким образом, не писать тип — дефолтное (а потому и нормальное) поведение программиста на Haskell, если смысл функции очевиден и/или объяснён отдельно (в коментарии, например) и без сигнатуры код компилируется адекватно.

Скажу по-другому: писать тип при каждом имени настолько же обосновано, как прописывать типы всех подтермов.
0
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,551
Записей в блоге: 9
04.01.2015, 09:33
Цитата Сообщение от Mysterious Light Посмотреть сообщение
Возлагать на программиста то, что может и должен делать компилятор
Вот, прямо, категорически, не согласен. Компилятор не знает что нам надо. Из практики, в том числе и на Haskell, даёт существенный выигрыш времени на отладку. Остальное - философия.

Добавлено через 22 минуты
smoke853, самое быстрое решение (за счёт использования подходящего контейнера).
Сatstail, Ваш вариант не работает.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38177 / 21112 / 4307
Регистрация: 12.02.2012
Сообщений: 34,716
Записей в блоге: 14
04.01.2015, 10:04  [ТС]
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Сatstail, Ваш вариант не работает.
- да, знак "<" нужно обратить:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
task :: [Int] -> [Int]
task x = map fst $ filter (\ z -> (fst z) >= (snd z)) (map (\ y -> (y , count y x)) x)
         where count p = foldl (\ acc y -> if (y==p) then acc+1 else acc) 0
 
Main> task [1,2,3,1,2,3,1,2,3,4]
[3,3,3,4]
Main> task [1,2,3,1,2,3,1,2,3,4,4,4,4,4,4]
[]
Main> task [2,3,1,2,3,2,3,4,4,4,4,4,4]
[]
Main> task [2,3,3,4,4,4,4,4,4]
[2,3,3]      
Main> task [2,2,3,3,4,4,4,4,4,4]
[2,2,3,3]
Main> task [2,2,2,3,3,4,4,4,4,4,4]
[3,3]
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
04.01.2015, 15:57
Про типы. Я тут опять отвлекся и вместо постижения монад баловался парой задачек, кстати, успешно. Не поверите - очень забавно получается, когда компилятор прожевывает код, а он на некоторых отдельных примерах работает неправильно, несмотря на его структурную правильность. А оказывается (после немалого исследования), что где-то внутри функции что-то переопределяется как Int и работает ограничение типа - молча и без ошибок. Потому что пока не использовал библиотечный take все было хорошо, а при его использовании в сигнатуре определен тип Int - и все валится из-за этой мелочи. Так что действительно лучше указать типы явно, хотя бы в сигнатуре самой внешней функции.
1
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,551
Записей в блоге: 9
04.01.2015, 16:11
Цитата Сообщение от _Ivana Посмотреть сообщение
пока не использовал библиотечный take все было хорошо, а при его использовании в сигнатуре определен тип Int - и все валится из-за этой мелочи
В Data.List определён и genericTake :: Integral i => i -> [a] -> [a]
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
04.01.2015, 19:45
Вот, оказывается два тэйка есть - для интов и для интеджеров. У меня то количество элементов списка влезает в инт, просто индексы получаются в результате арифметических операций над большими значениями, и когда я определяю переменную и потом вызываю тэйк с ее значением - тогда то все молча волшебно портится. Я то вышел из положения с помощью fromIntegral, но просто это те моменты (далеко не единственные), когда не ясно почему не работает. А на все случаи жизни дублей всех библиотечных !!, splitAt, take/drop и т.п. для интеджеровских аргументов не напасешься.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.01.2015, 19:45
Помогаю со студенческими работами здесь

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

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

Даны два списка одинаковой длины, элементы которых - числа. Найти список с элементами - суммами соответствующих элементов исходных списков
Даны два списка одинаковой длины, элементы которых - числа. Найти список с элементами - суммами соответствующих элементов исходных списков.

Удалить из списка все элементы, меньше заданного х
удалить из списка все элементы, меньше заданного х. например дано (3 6 8 3 5 6), х=5, получить (6 8 6).

Clojure Удалить из списка все элементы, меньше заданного x
Помогите решить задачи почти готовые 1.Удалить из списка все элементы, меньше заданного x. Например: дано (3 6 8 3 5 6), x=6, получить...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
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
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru