[Haskell-cafe] Re: split string into n parts
Jón Fairbairn
jon.fairbairn at cl.cam.ac.uk
Tue Oct 24 07:20:23 EDT 2006
I wrote:
> jim burton <jim at sdf-eu.org> wrote:
> > Thankyou! It's http://www.rubyquiz.com - They are mostly well suited to
> > haskell, lot of mazes etc. I've done 5 or 6 with varying degrees of success
> > but have learned a lot. This thing about strings in fifths is from #1, the
> > solitaire cipher.
>
> At a quick glance I can't see which bit needs it. The only
> mention of five is where it asks to split the string into
> groups of five characters (not into five equal parts),
> padded with Xs.
>
> You can do that like this:
>
> splitAtMb n l = let p = splitAt n l
> in if null $ fst p
> then Nothing
> else Just p
Gah! Brain AWOL. I'm surprised no-one picked me up on
that. Why didn't I use:
splitAtMb n [] = Nothing
splitAtMb n l = Just $ splitAt n l
?
> in_fives l = unfoldr (splitAtMb 5)
> (l ++ replicate (length l `mod` 5) 'X')
And using length makes this over-strict.
maybe something like
groups_of n = unfoldr (splitPad 5)
where splitPad [] = Nothing
splitPad l = Just $ mapFst (padwith 'X') (splitAt n l)
padwith c l = take n $ l ++ replicate n c
mapFst f (a,b) = (f a, b) -- in Data.Graph.Inductive.Query.Monad
which is a little bit inefficient, but less clunky than
checking for the end of list in order to apply padwith just
once.
--
Jón Fairbairn Jon.Fairbairn at cl.cam.ac.uk
More information about the Haskell-Cafe
mailing list