Форум программистов, компьютерный форум, киберфорум
Наши страницы
Haskell
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Moontary
0 / 0 / 0
Регистрация: 13.09.2016
Сообщений: 20
1

Удалить элементы из списка, которые входят в него дважды

19.03.2017, 12:55. Просмотров 1311. Ответов 6
Метки нет (Все метки)

В Хаскеле вообще ни бум бум, та и не нужно по направлению, но пытаясь разобраться, с целью сдачи лабораторных работ в универе, погуглил и нашёл данные варианты. Что скажете, посоветуете?

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
uniqEl :: Eq a => [a] -> [a]
uniqEl [] = []
uniqEl (x:xs) = if (x `elem` xs) then uniqEl xs else x : (uniqEl xs)
----------------------
delP :: Integer -> [Integer] -> [Integer]
delP e (x:xs) 
    | xs == [] = if x == e then []
            else x:[]
    | otherwise = if x == e then delP e xs
            else x:(delP e xs)
 
clearList :: [Integer] -> [Integer]
clearList [] = []
clearList (x:xs) | xs == [] = x:[]
clearList (x:xs) = x:(clearList (delP x xs))
-------------------
Оба варианта, исходя из слов авторов - удаляют повторения в любом кол-ве, когда мне нужно только для тех элементов, которые повторяются лишь дважды. С другой стороны, вопрос еще вот в чём. В случае когда я пытаюсь скомпилить и затестить данные примеры, что бы в итоге переделать под свой, то сталкиваюсь со следующей ошибкой и непониманием компилятора(Win7 WinGHCi)
Буду благодарен за любую помощь, а если еще подскажете как написать это дело через функцию count, будет сверх прелестно. Спасибо
0
Миниатюры
Удалить элементы из списка, которые входят в него дважды  
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2017, 12:55
Ответы с готовыми решениями:

Убрать из списка элементы, которые входят в него только один раз
Убрать из списка элементы, которые входят в него только один раз

Удалить из списка только те элементы, которые входят в него однократно
Я с Arity/Prolog v 6.00.99 не очень то, если кто сможет помогите пожалуйста: Дан список, который...

Удалить из списка L1 все элементы, которые входят в список L2
Даны списки L1 и L2, элементы которых являются целыми числами. Удалить из списка L1 все элементы,...

Сформировать список L, включив в него по одному разу элементы, которые входят одновременно в оба списка L1 и L2.
Ребят я запутался окончательно.Пытался сам разобраться,но увы только все хуже стало. задание:...

Сформировать список L, включив в него по одному разу элементы, которые входят одновременно в оба списка L1 и L2. Ошибка
Сформировать список L, включив в него по одному разу элементы, которые входят одновременно в оба...

6
Curry
2916 / 1981 / 248
Регистрация: 01.06.2013
Сообщений: 4,304
Записей в блоге: 8
19.03.2017, 14:41 2
Лучший ответ Сообщение было отмечено Moontary как решение

Решение

Цитата Сообщение от Moontary Посмотреть сообщение
только для тех элементов, которые повторяются лишь дважды
Haskell
1
2
3
4
5
6
7
8
9
10
import Data.List
 
job :: Ord a => [a] -> [a]
job l = filter (`notElem` dbls) l 
    where is2 [_,_] = True
          is2 _ = False
          dbls = map head $ filter is2 $ group $ sort l
 
main :: IO () 
main = print $ job "The quick brown fox jumps over the lazy dog"
Добавлено через 47 минут
Для элементов с ограничением только Eq.
Haskell
1
2
3
4
5
6
7
8
job :: Eq a => [a] -> [a]
job l = filter (`notElem` dbls) l 
    where dbls = go [] [] l
          go f s [] = f \\ s
          go f s (x:xs) | x `elem` s  = go f s xs
                        | (x `elem` f) && (x `elem` xs) = go f (x:s) xs
                        | x `elem` xs = go (x:f) s xs
                        | otherwise   = go f s xs
3
Moontary
0 / 0 / 0
Регистрация: 13.09.2016
Сообщений: 20
19.03.2017, 16:21  [ТС] 3
Огромное спасибо. Прочёл снова свою задачу и то что написал на форуме и понял что ужасно сформулировал. Главное что уловили суть. Премного благодарен еще раз.
Если можно подскажите еще вот что - где и что лучше прочесть, что бы вникнуть по быстрому, поверхностно, для решения следующей задачки, так как не хочу на пальцах потом обьяснять, как это работает.(Плюс ту что уже описана)
--------------
1)Повставлять элементы одного списка в упорядоченный по убыванию второй список. Сформировать список с номерами позиций, которые занимают элементы первого списка после вставки.(Возможно ли это реализовать с точки зрения алфавитной последовательности и в случае добавления в числовой ряд цифры, добавлять её на логичное место и соответственно для букв. Хотя это очень усложняет поставленную задачу, потому это скорее для себя вопрос)
0
_Ivana
4052 / 1888 / 235
Регистрация: 01.03.2013
Сообщений: 5,128
Записей в блоге: 22
19.03.2017, 17:20 4
Для ордящихся элементов:
Haskell
1
2
3
4
import qualified Data.Map as M
 
task l = filter (not . flip elem ds) l
    where ds = M.keys . M.filter (==2) . M.fromListWith (+) $ zip l [1,1..]
2
Curry
2916 / 1981 / 248
Регистрация: 01.06.2013
Сообщений: 4,304
Записей в блоге: 8
19.03.2017, 17:22 5
Лучший ответ Сообщение было отмечено Moontary как решение

Решение

Цитата Сообщение от Moontary Посмотреть сообщение
что лучше прочесть
https://www.ohaskell.guide/init.html
anton-k.github.io/ru-haskell-book/book/home.html
Душкин Р. В. Справочник по языку Haskell. 2008.
Цитата Сообщение от Moontary Посмотреть сообщение
Повставлять элементы одного списка в упорядоченный по убыванию второй список. Сформировать список с номерами позиций, которые занимают элементы первого списка после вставки.
Haskell
1
2
3
4
5
6
7
8
9
10
11
import Data.List
 
job :: Ord a => [a] -> [a] -> ([a],[Int])
job ins = go 0 [] [] (sortBy (flip compare) ins)
    where go _ n h [] rs = (reverse h ++ rs, reverse n)
          go i n h (a:aa) [] = go (i+1) (i:n) (a:h) aa []
          go i n h s@(a:aa) r@(x:xs) | x <= a    = go (i+1) (i:n) (a:h) aa r
                                     | otherwise = go (i+1) n     (x:h) s  xs
 
main :: IO () 
main = print $ job [3,1,4,1,5,9] [8,4,3,2]
То что у вас дальше не понял.
2
_Ivana
4052 / 1888 / 235
Регистрация: 01.03.2013
Сообщений: 5,128
Записей в блоге: 22
19.03.2017, 17:47 6
Haskell
1
2
3
4
5
ins x l = a ++ (x,True):b where (a,b) = span ((>x).fst) l
 
task a b = (map fst r, findIndices snd r) where r = foldr ins (zip b $ repeat False) a
 
main = print $ task [3,1,4,1,5,9] [8,4,3,2]
Добавлено через 8 минут
То что дальше - это невнятная попытка сформулировать концепцию лексикографического сравнения. Решается банальным добавлением любого желаемого кастомного компаратора бинарного предиката
3
Catstail
Модератор
24572 / 12485 / 2279
Регистрация: 12.02.2012
Сообщений: 20,271
19.03.2017, 18:50 7
Удаление из списка (Eq) элементов, которые встречаются ровно n раз:

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
-- Построение списка пар вида (эл-т,число-вхождений)
 
mkp :: (Eq a) => [a] -> [(a,Int)]
mkp [] = []
mkp (x:xs) = (x,l) : mkp xxs
             where  xxs=foldr (\ a acc -> if (a==x) then acc else a : acc) [] xs  
                    l=1+length xs - length xxs
 
-- Решение
                    
task :: (Eq a) => [a] -> Int -> [a]
task x n = filter (`elem` pl) x
           where pl = map fst $ filter (\ (v,k) -> k /= n) $ mkp x
 
*Main> task "qwertytqwq" 2
"qeryqq"
 
*Main> task "qwertytqwqttt" 2
"qertytqqttt"
 
*Main> task "qwertytqwqttt" 4
"qwertytqwqttt"
 
*Main> task "qwertytqwqttt" 5
"qweryqwq"
2
19.03.2017, 18:50
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2017, 18:50

Сформировать список Р, включив в него элементы списка Р1, которые не входят в список Р2
Как написать функцию или процедуру, которая формирует список Р, включив в него по одному разу...

Сформировать список l, включив в него по одному разу элементы, которые входят. В один из списков l1 или l2. Но не входят в другой
Добрый вечер! Собственно суть задачи такова: Я не совсем поняла списки, вы не могли бы помочь...

Дописать в начало списка элементы, которые входят в L1, но не входят в L2
Дано задание: &quot;Cформировать список L из элементов, которые входят одновременно в списки L1 и L2....


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru