I've got the following function:
munch :: String -> String munch = take 9 . chomp
Which will take the longest amount of repeated characters from a string and one will limit this to 9, e.g. if given the string "aaaaabbbcc" , the answer would be "aaaaa"
I need to define a function, runs, which will do a similiar thing but it will put the string into separate lists, e.g. if the given string is
"aaaaabbbccc" , the answer would be
["aaaaa","bbb","cc"], and I need to use the munch function to do this.
The condition of 9 characters applies too, so if the given string is
"aaaaaaaaaa" , the answer would be
I've not actually got any implementation apart from something that I found which does pretty much does the same thing without the limit of 9 characters:
runs :: String -> String runs x = group x
I thought of 2 ways of doing this, but I have no clue on the actual implementation, with one being to run the munch function for however many unique characters there are, i.e if there is an x amount of a , b , c in the given string, it would run 3 times, and then put those lists together into one list.
Another way that I thought of is to use guards. If the number of any single character in the given string is 9 or less, then just use the group function, otherwise, shorten it down using munch, or something like that.
Is anyone able to tell me if the two ideas I mentioned would work at all or suggest an alternative and how to get started? I'm a bit lost.
A quick google gives you exactly what you're looking for.
If it works consider upvoting their answer as I only copied a link
here is another approach
define a split function to break arrays at fixed size chunks
splitn :: Int -> [a] -> [[a]] splitn _  =  splitn n x = take n x : (splitn n $ drop n x)
now you can write your function as
runs = concatMap (splitn 9) . group