[Haskell] Найти все конечные подпоследовательности
От: hexamino http://hexamino.blogspot.com/
Дата: 06.10.09 11:52
Оценка:
Надо написать функцию, которая, получив на вход список (конечный или бесконечный), вернет список всех его конечных подпоследовательностей. Для бесконечного исходного списка подпоследовательностей должно быть, естественно, бесконечно много. Помогите, пожалуйста.
Re: [Haskell] Найти все конечные подпоследовательности
От: nikov США http://www.linkedin.com/in/nikov
Дата: 06.10.09 11:57
Оценка:
Здравствуйте, 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] Найти все конечные подпоследовательности
От: Кодт Россия  
Дата: 08.10.09 11:33
Оценка:
Здравствуйте, 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] Найти все конечные подпоследовательности
От: BulatZiganshin  
Дата: 08.10.09 11:47
Оценка: 34 (2)
Здравствуйте, hexamino, Вы писали:

H>Надо написать функцию, которая, получив на вход список (конечный или бесконечный), вернет список всех его конечных подпоследовательностей. Для бесконечного исходного списка подпоследовательностей должно быть, естественно, бесконечно много. Помогите, пожалуйста.


sub (x:xs) = [[x]] ++ concatMap (\a -> [x:a,a]) (sub xs)
sub [] = []
Люди, я люблю вас! Будьте бдительны!!!
Re[2]: [Haskell] Найти все конечные подпоследовательности
От: nikov США http://www.linkedin.com/in/nikov
Дата: 08.10.09 12:28
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

BZ>
BZ>sub (x:xs) = [[x]] ++ concatMap (\a -> [x:a,a]) (sub xs)
BZ>sub [] = []
BZ>


Не хватает пустой подпоследовательнсти.
Re: [Haskell] Найти все конечные подпоследовательности
От: thesz Россия http://thesz.livejournal.com
Дата: 08.10.09 13:12
Оценка: :)
Здравствуйте, hexamino, Вы писали:

H>Надо написать функцию, которая, получив на вход список (конечный или бесконечный), вернет список всех его конечных подпоследовательностей. Для бесконечного исходного списка подпоследовательностей должно быть, естественно, бесконечно много. Помогите, пожалуйста.


Конечная подпоследовательность — подпоследовательность, содержащаяся в конце списка.

На конце списка всегда находится пустой список. [].

Единственная подпоследовательность, содержащаяся в пустом списке, это пустой список.

Поэтому решение твоей задачи просто:

subsequences [] = []
subsequences (x:xs) = subsequences xs


Для бесконечного входного списка точное число подпоследовательностей не определено (_|_). Определение выше этому соответствует, надо сказать.

Думаю, смело могу сказать, что моё решение самое простое и самое краткое.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[2]: [Haskell] Найти все конечные подпоследовательности
От: hexamino http://hexamino.blogspot.com/
Дата: 08.10.09 13:19
Оценка:
Здравствуйте, thesz, Вы писали:

T>Здравствуйте, hexamino, Вы писали:


H>>Надо написать функцию, которая, получив на вход список (конечный или бесконечный), вернет список всех его конечных подпоследовательностей. Для бесконечного исходного списка подпоследовательностей должно быть, естественно, бесконечно много. Помогите, пожалуйста.


T>Конечная подпоследовательность — подпоследовательность, содержащаяся в конце списка.


Нет, конечная — это содержащая конечное (не бесконечное) число элементов.
Re[2]: [Haskell] Найти все конечные подпоследовательности
От: geniepro http://geniepro.livejournal.com/
Дата: 08.10.09 15:19
Оценка:
Здравствуйте, thesz, Вы писали:

T>Здравствуйте, hexamino, Вы писали:


H>>Надо написать функцию, которая, получив на вход список (конечный или бесконечный), вернет список всех его конечных подпоследовательностей. Для бесконечного исходного списка подпоследовательностей должно быть, естественно, бесконечно много. Помогите, пожалуйста.


T>Конечная подпоследовательность — подпоследовательность, содержащаяся в конце списка.


T>На конце списка всегда находится пустой список. [].


T>Единственная подпоследовательность, содержащаяся в пустом списке, это пустой список.


Прикольный ответ, конечно, хотя автор имел в виду не такое понимание "конечных подпоследовательностей"
Но если принять Ваш вариант ТЗ, то вот решение короче:

f xs = []
Re[3]: [Haskell] Найти все конечные подпоследовательности
От: thesz Россия http://thesz.livejournal.com
Дата: 08.10.09 15:27
Оценка:
Здравствуйте, geniepro, Вы писали:

G>Здравствуйте, thesz, Вы писали:


T>>Здравствуйте, hexamino, Вы писали:


T>>Конечная подпоследовательность — подпоследовательность, содержащаяся в конце списка.


G>Прикольный ответ, конечно, хотя автор имел в виду не такое понимание "конечных подпоследовательностей"

G>Но если принять Ваш вариант ТЗ, то вот решение короче:

G>
f xs = []


К сожалению, это не проходит для бесконечной последовательности.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[4]: [Haskell] Найти все конечные подпоследовательности
От: geniepro http://geniepro.livejournal.com/
Дата: 08.10.09 15:37
Оценка:
Здравствуйте, thesz, Вы писали:

T>К сожалению, это не проходит для бесконечной последовательности.


хм, тогда да...
Re[3]: [Haskell] Найти все конечные подпоследовательности
От: thesz Россия http://thesz.livejournal.com
Дата: 08.10.09 15:41
Оценка:
Здравствуйте, hexamino, Вы писали:

H>Здравствуйте, thesz, Вы писали:


T>>Здравствуйте, hexamino, Вы писали:


H>>>Надо написать функцию, которая, получив на вход список (конечный или бесконечный), вернет список всех его конечных подпоследовательностей. Для бесконечного исходного списка подпоследовательностей должно быть, естественно, бесконечно много. Помогите, пожалуйста.


T>>Конечная подпоследовательность — подпоследовательность, содержащаяся в конце списка.

H>Нет, конечная — это содержащая конечное (не бесконечное) число элементов.

Смотрим на http://hexamino.blogspot.com/ (из твоего профиля)

Видим там вот такое:

Дополнительные навыки: 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] Найти все конечные подпоследовательности
От: Кодт Россия  
Дата: 08.10.09 16:32
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

H>>Надо написать функцию, которая, получив на вход список (конечный или бесконечный), вернет список всех его конечных подпоследовательностей. Для бесконечного исходного списка подпоследовательностей должно быть, естественно, бесконечно много. Помогите, пожалуйста.

BZ>sub (x:xs) = [[x]] ++ concatMap (\a -> [x:a,a]) (sub xs)
BZ>sub [] = []

Что-то криво получается. С повторениями.
subs ['A'..] =
""
"A"
""
"AB"
"B"
"A"
""
"ABC"
"BC"
"AC"
"C"
"AB"
"B"
"A"
""
"ABCD"
"BCD"
"ACD"
"CD"
"ABD"
"BD"
"AD"
"D"
"ABC"
"BC"
"AC"
"C"
"AB"
"B"
"A"
""
...
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[4]: [Haskell] Найти все конечные подпоследовательности
От: Кодт Россия  
Дата: 08.10.09 16:36
Оценка:
Здравствуйте, thesz, Вы писали:

T>Я считаю, что ты наврал в рекламе самого себя, поскольку спрашиваешь решение тривиальной задачи.


Тривиальная? Вон Булат с разбега дал красивое и неправильное решение. А nikov-у пришлось прибегнуть к арифметике.

Кстати, то, что ты назвал "конечной", вообще-то, "концевая".
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[4]: [Haskell] Найти все конечные подпоследовательности
От: hexamino http://hexamino.blogspot.com/
Дата: 08.10.09 16:41
Оценка:
Здравствуйте, thesz, Вы писали:

T>Видим там вот такое:

Дополнительные навыки: C++, Java, Scala, Haskell, F#, VB.NET, JavaScript, HTML, XML/XSLT, T-SQL; работа с базами данных, разработка web-приложений, обработка финансовых данных.


T>Я считаю, что ты наврал в рекламе самого себя, поскольку спрашиваешь решение тривиальной задачи.


А что мне думать о тебе, после того, как ты даже не смог понять ее условие?
На самом деле, у меня было свое решение, но оно было более громоздкое, чем приведенные в этой ветке. К сожалению, Haskell — не мой основной навык, о чем я и написал в своем блоге.
Re[3]: [Haskell] Найти все конечные подпоследовательности
От: BulatZiganshin  
Дата: 08.10.09 16:43
Оценка:
Здравствуйте, Кодт, Вы писали:

К>
BZ>>sub (x:xs) = [[x]] ++ concatMap (\a -> [x:a,a]) (sub xs)
BZ>>sub [] = []
К>

К>Что-то криво получается. С повторениями.
К>subs ['A'..] =

sub /= subs
Люди, я люблю вас! Будьте бдительны!!!
Re[4]: [Haskell] Найти все конечные подпоследовательности
От: Кодт Россия  
Дата: 08.10.09 16:48
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

К>>Что-то криво получается. С повторениями.

К>>subs ['A'..] =

BZ>sub /= subs


Это я очепятался, когда писал сообщение. А sub всё равно рожает с повторениями.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[5]: [Haskell] Найти все конечные подпоследовательности
От: thesz Россия http://thesz.livejournal.com
Дата: 08.10.09 16:55
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, thesz, Вы писали:


T>>Я считаю, что ты наврал в рекламе самого себя, поскольку спрашиваешь решение тривиальной задачи.


К>Тривиальная? Вон Булат с разбега дал красивое и неправильное решение. А nikov-у пришлось прибегнуть к арифметике.


Это получение 2^n, по-моему. Вся сложность в трудности проверок.

Второе: http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data-List.html#v%3Asubsequences

Проблемы могут быть с бесконечностью, тут уже начинаются нюансы.

Здесь может помочь http://hackage.haskell.org/package/control-monad-omega

К>Кстати, то, что ты назвал "конечной", вообще-то, "концевая".


Для автора исходного задания мне ничего не жалко.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[2]: [Haskell] Найти все конечные подпоследовательности
От: Кодт Россия  
Дата: 08.10.09 16:58
Оценка:
Здравствуйте, nikov, Вы писали:

N>
N>finiteSublists :: [a] -> [[a]]
N>finiteSublists xs = concat f
N>  where f = [[]] : [map (++[x]) $ concat $ take (n+1) f | (x,n) <- zip xs [0..]]
N>


Поскольку take::Int->..., то [0..] = [0::Int..] = [0..2^31-1]
В общем, не очень далеко уедем.
Нужно избавляться от арифметики.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[3]: [Haskell] Найти все конечные подпоследовательности
От: nikov США http://www.linkedin.com/in/nikov
Дата: 08.10.09 16:59
Оценка:
Здравствуйте, Кодт, Вы писали:

К>В общем, не очень далеко уедем.

К>Нужно избавляться от арифметики.

Да мне самому не нравится. Не декларативно.
Re[5]: [Haskell] Найти все конечные подпоследовательности
От: Буравчик Россия  
Дата: 08.10.09 17:03
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Это я очепятался, когда писал сообщение. А sub всё равно рожает с повторениями.


А у меня все работает

*Main Data.List> mapM_ (putStrLn.show) $ take 30 $ sub' ['A'..]
"A"
"AB"
"B"
"ABC"
"BC"
"AC"
"C"
"ABCD"
"BCD"
"ACD"
"CD"
"ABD"
"BD"
"AD"
"D"
"ABCDE"
"BCDE"
"ACDE"
"CDE"
"ABDE"
"BDE"
"ADE"
"DE"
"ABCE"
"BCE"
"ACE"
"CE"
"ABE"
"BE"
"AE"

... << RSDN@Home 1.2.0 alpha 4 rev. 1218>>
Best regards, Буравчик
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.