String 使用条件缩短Haskell中的字符串
Chomp将从一个字符串中获取最长的重复字符数,并将其限制为9,例如,如果给定字符串“aaaabbbcc”,则答案将为“aaaaa” 我需要定义一个函数runs,它将做类似的事情,但它会将字符串放入单独的列表中,例如,如果给定的字符串是String 使用条件缩短Haskell中的字符串,string,haskell,String,Haskell,Chomp将从一个字符串中获取最长的重复字符数,并将其限制为9,例如,如果给定字符串“aaaabbbcc”,则答案将为“aaaaa” 我需要定义一个函数runs,它将做类似的事情,但它会将字符串放入单独的列表中,例如,如果给定的字符串是“aaaaaabbbccc”,答案将是[“aaaaaaa”,“bbb”,“cc”],我需要使用munch函数来完成这项工作 9个字符的条件也适用,因此如果给定的字符串是“aaaaaaaa”,答案将是[“aaaaaaaaaaa”,“a”] 实际上,我没有任何实现,除
“aaaaaabbbccc”
,答案将是[“aaaaaaa”,“bbb”,“cc”]
,我需要使用munch函数来完成这项工作
9个字符的条件也适用,因此如果给定的字符串是“aaaaaaaa”
,答案将是[“aaaaaaaaaaa”,“a”]
实际上,我没有任何实现,除了我发现的一些实现,它几乎可以做相同的事情,没有9个字符的限制:
runs :: String -> String
runs x = group x
我想到了两种方法,但是我对实际的实现没有任何线索,一种是运行munch函数,不管有多少个唯一的字符,也就是说,如果给定的字符串中有x个数量的a、b、c,它将运行3次,然后将这些列表放在一个列表中
我想到的另一种方法是使用警卫。如果给定字符串中任何单个字符的数目为9或更少,则只需使用group函数,否则,请使用munch或类似的方法将其缩短
有人能告诉我我提到的两个想法是否可行,或者建议一个替代方案,以及如何开始?我有点迷路了。快速搜索一下谷歌,你就会找到你想要的东西
如果它起作用,考虑一下他们的答案,因为我只复制了一个链接
这是另一个方法 定义一个拆分函数,在固定大小的块上拆分列表splitn :: Int -> [a] -> [[a]]
splitn _ [] = []
splitn n x = take n x : (splitn n $ drop n x)
现在您可以将函数编写为
runs = concatMap (splitn 9) . group
这里的基本策略是采用每个唯一的列表元素来标识相同的连续列表元素。这使您可以以任意混合顺序列出元素。有三个功能,但没有导入 第一个函数是
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 ]
l=“bbbbbbbbaaaaaaaaaaaa dddadaaaaaaaacccccc”
rd[]=[];rd(x:xs)| elem x xs=rd xs |否则=x:rd xs
t9[]=[];T9XS=[take 9XS]++t9(drop 9XS)
[t | f什么是chomp
?munch
做什么?你确定吗?chomp
是如何定义的?为什么你必须使用munch
?你对chomp
做什么的描述是错误的。“我需要使用munch
函数来做这件事。”假设这是一个家庭作业,并且你被告知需要使用munch
函数,我怀疑你是否会因为使用group
而获得学分。在这种情况下,我会递归地使用munch
来提取每个块。然后你可以删除块的长度,以获取字符串的其余部分,继续循环。@DarthFennec这是有道理的。我认为这与我在帖子中提到的一个想法类似,但你的想法中有更多的Haskell;你能用chunksOf
而不是splitn
?它们有相同的签名。@elmex80当然,如果我记得它存在的话!