在条件中缩短Haskell中的字符串

时间:2019-03-14 20:09:52

标签: string haskell

Chomp将从字符串中获取最长的重复字符,并且将其限制为9,例如如果给定字符串“ aaaaabbbcc”,答案将为“ aaaaa”

我需要定义一个运行的函数,该函数会做类似的事情,但是会将字符串放入单独的列表中,例如如果给定的字符串是"aaaaabbbccc",则答案将是["aaaaa","bbb","cc"],我需要使用munch函数来做到这一点。

9个字符的条件也适用,因此如果给定的字符串为"aaaaaaaaaa",则答案为["aaaaaaaaa","a"]

我发现除了9个字符的限制外,几乎没有做任何事情,实际上我没有任何实现方式。

runs :: String -> String
runs x = group x

我想到了两种方法,但是我对实际的实现一无所知,其中一种方法是针对许多唯一字符运行munch函数,即,如果x等于a,b, c在给定的字符串中,它将运行3次,然后将这些列表放到一个列表中。

我想到的另一种方法是使用警卫。如果给定字符串中任何单个字符的数量为9个或更少,则只需使用group函数,否则,使用munch或类似的方法将其缩短。

有人能告诉我我提到的两个想法是否完全奏效或提出替代方案以及如何开始吗?我有点迷路了。

3 个答案:

答案 0 :(得分:1)

这是另一种方法

定义一个拆分函数以固定大小的块中断列表

splitn :: Int -> [a] -> [[a]]
splitn _ [] = []
splitn n x = take n x : (splitn n $ drop n x)

现在您可以将函数编写为

runs =  concatMap (splitn 9) . group

答案 1 :(得分:0)

快速的Google会为您提供所需的信息。

https://codereview.stackexchange.com/questions/158183/string-splitting-function-in-haskell

如果可行,请考虑提高他们的答案,因为我只复制了一个链接

答案 2 :(得分:0)

这里的基本策略是采用每个唯一列表元素来标识相同的连续列表元素。这使您可以按任何混合顺序使用列表元素。有三个功能,但没有导入。

第一个函数是rd,它创建唯一元素的列表。

第二个功能t9是因为相同的元素可能超过18个。 t9将创建9个字符长的列表段,这些段的元素相同,其余部分作为最后一个列表(字符串)。

最后的未命名函数使用rd来编译与每个唯一元素匹配的所有元素的列表。它使用t9创建9个元素的段。

l = "bbbbbbbbbaaaaaaaaaaaadddadaaaaaaacccccccccc"
rd [] = []; rd (x:xs) | elem x xs = rd xs | otherwise = x:rd xs
t9 [] = []; t9 xs = [take 9 xs] ++ t9 (drop 9 xs)
[ t | f <- rd l, s <- [[ g | g <- l, f == g ]], t <- t9 s ]

[“ bbbbbbbbb”,“ dddd”,“ aaaaaaaaa”,“ aaaaaaaaa”,“ aa”,“ ccccccccc,” c“]