Надо написать функцию, которая, получив на вход список (конечный или бесконечный), вернет список всех его конечных подпоследовательностей. Для бесконечного исходного списка подпоследовательностей должно быть, естественно, бесконечно много. Помогите, пожалуйста.
Re: [Haskell] Найти все конечные подпоследовательности
Здравствуйте, hexamino, Вы писали:
H>Надо написать функцию, которая, получив на вход список (конечный или бесконечный), вернет список всех его конечных подпоследовательностей. Для бесконечного исходного списка подпоследовательностей должно быть, естественно, бесконечно много.
finiteSublists :: [a] -> [[a]]
finiteSublists xs = concat f
where f = [[]] : [map (++[x]) $ concat $ take (n+1) f | (x,n) <- zip xs [0..]]
Re: [Haskell] Найти все конечные подпоследовательности
Здравствуйте, hexamino, Вы писали:
H>Надо написать функцию, которая, получив на вход список (конечный или бесконечный), вернет список всех его конечных подпоследовательностей. Для бесконечного исходного списка подпоследовательностей должно быть, естественно, бесконечно много. Помогите, пожалуйста.
План такой: для каждого элемента списка найти все последовательности головной части списка, не доходящей до него, плюс этот элемент.
splits :: [a] -> [([a],a)] -- разбивает на сочетания (префикс, голова суффикса)
splits xs = splits' [] xs where
splits' _ [] = []
splits' ys (z:zs) = (ys,z) : splits' (ys++[z]) zs
finites :: [a] -> [[a]]
finites xs =
[[]] -- пустая есть всегда
++
concat (map make' pairs') where
make' (ys,z) = map (++[z]) (subsequences ys)
pairs' = splits xs
subsequences xs = finites xs -- либо любой другой алгоритм (который может уже заложиться на то, что xs конечный)
Можно попробовать всё это добро выразить в линзах-бананах или ZF-нотации. Но, боюсь, понятность кода от этого проиграет.
Проверяем
test xs = do
putStrLn $ "source is " ++ show xs
let q___q = map (const '-') $ show xs
putStrLn q___q
let ss = finites xs
mapM_ (putStrLn . show) ss
putStrLn q___q
main = do
test ""
test "abcd"
на выходе
source is ""
--
""
--
source is "a"
---
""
"a"
---
source is "abcd"
------
"" -- первый (особый) случай
"a" -- разбили на "",'a',...
"b" -- разбили на "a",'b',...
"ab"
"c" -- разбили на "ab",'c',...
"ac"
"bc"
"abc"
"d" -- разбили на "abc",'d',...
"ad"
"bd"
"abd"
"cd"
"acd"
"bcd"
"abcd"
------ -- могли бы и дальше перебирать, но здесь суффикс внезапно иссяк
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re: [Haskell] Найти все конечные подпоследовательности
Здравствуйте, hexamino, Вы писали:
H>Надо написать функцию, которая, получив на вход список (конечный или бесконечный), вернет список всех его конечных подпоследовательностей. Для бесконечного исходного списка подпоследовательностей должно быть, естественно, бесконечно много. Помогите, пожалуйста.
sub (x:xs) = [[x]] ++ concatMap (\a -> [x:a,a]) (sub xs)
sub [] = []
Люди, я люблю вас! Будьте бдительны!!!
Re[2]: [Haskell] Найти все конечные подпоследовательности
Здравствуйте, hexamino, Вы писали:
H>Надо написать функцию, которая, получив на вход список (конечный или бесконечный), вернет список всех его конечных подпоследовательностей. Для бесконечного исходного списка подпоследовательностей должно быть, естественно, бесконечно много. Помогите, пожалуйста.
Конечная подпоследовательность — подпоследовательность, содержащаяся в конце списка.
На конце списка всегда находится пустой список. [].
Единственная подпоследовательность, содержащаяся в пустом списке, это пустой список.
Здравствуйте, thesz, Вы писали:
T>Здравствуйте, hexamino, Вы писали:
H>>Надо написать функцию, которая, получив на вход список (конечный или бесконечный), вернет список всех его конечных подпоследовательностей. Для бесконечного исходного списка подпоследовательностей должно быть, естественно, бесконечно много. Помогите, пожалуйста.
T>Конечная подпоследовательность — подпоследовательность, содержащаяся в конце списка.
Нет, конечная — это содержащая конечное (не бесконечное) число элементов.
Re[2]: [Haskell] Найти все конечные подпоследовательности
Здравствуйте, thesz, Вы писали:
T>Здравствуйте, hexamino, Вы писали:
H>>Надо написать функцию, которая, получив на вход список (конечный или бесконечный), вернет список всех его конечных подпоследовательностей. Для бесконечного исходного списка подпоследовательностей должно быть, естественно, бесконечно много. Помогите, пожалуйста.
T>Конечная подпоследовательность — подпоследовательность, содержащаяся в конце списка.
T>На конце списка всегда находится пустой список. [].
T>Единственная подпоследовательность, содержащаяся в пустом списке, это пустой список.
Прикольный ответ, конечно, хотя автор имел в виду не такое понимание "конечных подпоследовательностей"
Но если принять Ваш вариант ТЗ, то вот решение короче:
f xs = []
Re[3]: [Haskell] Найти все конечные подпоследовательности
Здравствуйте, geniepro, Вы писали:
G>Здравствуйте, thesz, Вы писали:
T>>Здравствуйте, hexamino, Вы писали:
T>>Конечная подпоследовательность — подпоследовательность, содержащаяся в конце списка.
G>Прикольный ответ, конечно, хотя автор имел в виду не такое понимание "конечных подпоследовательностей" G>Но если принять Ваш вариант ТЗ, то вот решение короче:
G>
f xs = []
К сожалению, это не проходит для бесконечной последовательности.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[4]: [Haskell] Найти все конечные подпоследовательности
Здравствуйте, hexamino, Вы писали:
H>Здравствуйте, thesz, Вы писали:
T>>Здравствуйте, hexamino, Вы писали:
H>>>Надо написать функцию, которая, получив на вход список (конечный или бесконечный), вернет список всех его конечных подпоследовательностей. Для бесконечного исходного списка подпоследовательностей должно быть, естественно, бесконечно много. Помогите, пожалуйста.
T>>Конечная подпоследовательность — подпоследовательность, содержащаяся в конце списка. H>Нет, конечная — это содержащая конечное (не бесконечное) число элементов.
Дополнительные навыки: C++, Java, Scala, Haskell, F#, VB.NET, JavaScript, HTML, XML/XSLT, T-SQL; работа с базами данных, разработка web-приложений, обработка финансовых данных.
Я считаю, что ты наврал в рекламе самого себя, поскольку спрашиваешь решение тривиальной задачи.
Я считаю, что это плохо. Поэтому я не буду решать эту и другие задачи, которые ты здесь будешь излагать.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[2]: [Haskell] Найти все конечные подпоследовательности
Здравствуйте, BulatZiganshin, Вы писали:
H>>Надо написать функцию, которая, получив на вход список (конечный или бесконечный), вернет список всех его конечных подпоследовательностей. Для бесконечного исходного списка подпоследовательностей должно быть, естественно, бесконечно много. Помогите, пожалуйста.
Здравствуйте, thesz, Вы писали:
T>Видим там вот такое:
Дополнительные навыки: C++, Java, Scala, Haskell, F#, VB.NET, JavaScript, HTML, XML/XSLT, T-SQL; работа с базами данных, разработка web-приложений, обработка финансовых данных.
T>Я считаю, что ты наврал в рекламе самого себя, поскольку спрашиваешь решение тривиальной задачи.
А что мне думать о тебе, после того, как ты даже не смог понять ее условие?
На самом деле, у меня было свое решение, но оно было более громоздкое, чем приведенные в этой ветке. К сожалению, Haskell — не мой основной навык, о чем я и написал в своем блоге.
Re[3]: [Haskell] Найти все конечные подпоследовательности
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, thesz, Вы писали:
T>>Я считаю, что ты наврал в рекламе самого себя, поскольку спрашиваешь решение тривиальной задачи.
К>Тривиальная? Вон Булат с разбега дал красивое и неправильное решение. А nikov-у пришлось прибегнуть к арифметике.
Это получение 2^n, по-моему. Вся сложность в трудности проверок.