0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 3
1

Разделение списка Split

10.12.2016, 12:47. Показов 3160. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Необходимо реализовать функцию split, которая разделяет список элементом, который передаётся параметром.

Prelude> split ',' "a,b,c"
["a","b","c"]

Prelude> split 2 [1,2,3,2,4,4,2,5]
[[1], [3], [4,4], [5]]
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2016, 12:47
Ответы с готовыми решениями:

Разделение списка
Ребят, всем привет. Помогите, пожалуйста, реализовать следующую программу: функция, осуществляющая...

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

Разделение списка на подсписки: в первый n элементов с начала списка, во второй оставшиеся
Определите функцию, осуществляющую разделение исходного списка на два подсписка. В первый из них...

Разделение списка на два списка
помогите пожалуйста, когда ввожу цели у меня вылазит ошибка free variable in expression и из целей...

9
Модератор
Эксперт функциональных языков программированияЭксперт Python
36578 / 20308 / 4218
Регистрация: 12.02.2012
Сообщений: 33,606
Записей в блоге: 13
10.12.2016, 17:10 2
Лучший ответ Сообщение было отмечено SundayMonday как решение

Решение

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
split' :: (Eq a) => a -> [a] -> [a] -> [[a]]
split' _ [] acc = [acc]
split' d (y:ys) acc | (y == d) = acc : (split' d ys []) 
                    | otherwise = split' d ys (acc ++ [y])
                    
split :: (Eq a) => a -> [a] -> [[a]]
split d x = split' d x []
 
Main> split ',' "a,b,c"
["a","b","c"]
 
Main> split 2 [1,2,3,2,4,4,2,5]
[[1],[3],[4,4],[5]]
1
Модератор
5046 / 3275 / 526
Регистрация: 01.06.2013
Сообщений: 6,802
Записей в блоге: 9
10.12.2016, 18:31 3
Haskell
1
2
3
4
5
6
7
8
split :: Eq a => a -> [a] -> [[a]]
split d = snd . splt 
  where splt xs = case brk xs of
                        ([],f) -> ([],[f])
                        (r,f) -> (f:) <$> splt r 
        brk [] = ([],[])
        brk (x:xs) | x==d = (xs,[])
        brk (x:xs) = (x:) <$> brk xs
Добавлено через 7 минут
или
Haskell
1
2
3
4
5
6
7
8
{-# LANGUAGE ViewPatterns #-}
split :: Eq a => a -> [a] -> [[a]]
split d = snd . splt 
  where splt (brk ->(r,f)) | null r = ([],[f])
                           | otherwise = (f:) <$> splt r 
        brk [] = ([],[])
        brk (x:xs) | x==d = (xs,[])
        brk (x:xs) = (x:) <$> brk xs
2
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
11.12.2016, 00:25 4
Haskell
1
2
3
4
5
import Data.List
 
split :: Eq a => a -> [a] -> [[a]]
split _ [] = []
split d l  = uncurry (:) . fmap (split d . drop 1) . break (==d) $ l
3
Модератор
5046 / 3275 / 526
Регистрация: 01.06.2013
Сообщений: 6,802
Записей в блоге: 9
11.12.2016, 04:22 5
Haskell
1
2
3
4
5
6
import qualified Data.List.Split as S -- пакет split
-- или import qualified Data.List.Extra as E -- пакет extra
 
split :: Eq a => a -> [a] -> [[a]]        
split d = S.splitWhen (d==)
       -- E.split
1
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 3
12.12.2016, 20:28  [ТС] 6
Если не сложно можете описать как работает данная функция. Заранее спасибо.
0
Модератор
5046 / 3275 / 526
Регистрация: 01.06.2013
Сообщений: 6,802
Записей в блоге: 9
12.12.2016, 21:07 7
Цитата Сообщение от SundayMonday Посмотреть сообщение
Если не сложно можете описать как работает данная функция. Заранее спасибо.
вызывает функцию splitWhen из пакета split делающую, как сами видите, практически то что требуется.
1
0 / 0 / 0
Регистрация: 10.12.2016
Сообщений: 3
12.12.2016, 21:14  [ТС] 8
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
вызывает функцию splitWhen из пакета split делающую, как сами видите, практически то что требуется.
Ваш пример реализации я понял. Но к сожалении мне нужно что бы функция не использовала пакет split.
Можете пожалуйста пояснить вот эту.
Haskell
1
2
3
4
5
6
7
split' :: (Eq a) => a -> [a] -> [a] -> [[a]]
split' _ [] acc = [acc]
split' d (y:ys) acc | (y == d) = acc : (split' d ys []) 
                    | otherwise = split' d ys (acc ++ [y])
                    
split :: (Eq a) => a -> [a] -> [[a]]
split d x = split' d x []
0
Curry
12.12.2016, 23:26
  #9

Не по теме:

Цитата Сообщение от SundayMonday Посмотреть сообщение
Можете пожалуйста пояснить вот эту.
Автор кода здесь присутствует. Так что, с моей стороны, определённо, было бы не комильфо комментировать в таких условиях не мой код.

0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36578 / 20308 / 4218
Регистрация: 12.02.2012
Сообщений: 33,606
Записей в блоге: 13
13.12.2016, 08:38 10
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
split' :: (Eq a) => a -> [a] -> [a] -> [[a]] -- сигнатура функции  
-- параметры:
-- 1) разделяющий элемент
-- 2) расщепляемый список
-- 3) накопительный параметр
split' _ [] acc = [acc]  -- терминальная ветвь рекурсии (когда список исчерпан - возвращаем то, что накопили)
split' d (y:ys) acc | (y == d) = acc : (split' d ys [])  -- если первый элемент совпадает с разд. элементом,
                                                                      -- выносим в начало то, что накопили, и продолжаем расщепление
                                                                      -- с пустым накопителем
                    | otherwise = split' d ys (acc ++ [y]) -- иначе продолжаем расщепление, добавив первый эл-т в хвост 
                                                                      -- накопителя
                    
split :: (Eq a) => a -> [a] -> [[a]]  -- это просто обертка для функции, описанной выше (чтобы при запуске
split d x = split' d x []                   -- не задавать лишних параметров
1
13.12.2016, 08:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.12.2016, 08:38
Помогаю со студенческими работами здесь

Разделение списка
Здравствуйте, помогите, пожалуйста, исправить задачу: Создайте предикат, осуществляющий...

Разделение списка
Помогите пожалуйста решить задачу: Создать процедуру split(+List,–Nums,–Rest), разделяющую...

Разделение списка
Помогите в решении задач: Создать функцию, которая разделит исходный список из целых чисел на...

Разделение списка и перестановка элементов
Здравствуйте, помогите написать программы: 1) Создайте предикат, осуществляющий разделение...

Реализовать разделение списка на два
Определите отношение divideList(+List, –List1, –List2) таким образом, чтобы элементы списка List...

SWI Prolog. Разделение и соединение списка.
Помогите написать программу разделения исходного списка по N-му элементу и соединения полученных...


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

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

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