[Haskell-cafe] Re: split string into n parts

Jón Fairbairn jon.fairbairn at cl.cam.ac.uk
Mon Oct 23 16:45:10 EDT 2006

jim burton <jim at sdf-eu.org> writes:

> Paul Brown-4 wrote:
> > 
> >> Cool idea!  Can you post a link for the puzzles?
> > 
> 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

   in_fives l = unfoldr (splitAtMb 5)
                        (l ++ replicate (length l `mod` 5) 'X')

To break a string into five equal parts with the last padded
with Xs, try this:

   fifths l = let len = length l
                  part_length = (len+4)`div`5
                  pad_length = 5*part_length - len
              in unfoldr (splitAtMb part_length)
                         (l ++ replicate pad_length 'X')

I haven't checked these at all carefully, but at least they
illustrate the use of unfoldr.  [aside: One might argue that
the prelude ought to provide splitAtMb rather than splitAt.]

Jón Fairbairn                                 Jon.Fairbairn at cl.cam.ac.uk

More information about the Haskell-Cafe mailing list