Difference between revisions of "99 questions/Solutions/19"

From HaskellWiki
Jump to navigation Jump to search
Line 35: Line 35:
 
where
 
where
 
nn = n `mod` length xs
 
nn = n `mod` length xs
  +
</haskell>
  +
  +
Using a simple splitAt trick
  +
<haskell>
  +
rotate xs n
  +
| n < 0 = rotate xs (n+len)
  +
| n > len = rotate xs (n-len)
  +
| otherwise = let (f,s) = splitAt n xs in s ++ f
  +
where len = length xs
 
</haskell>
 
</haskell>

Revision as of 04:54, 20 November 2010

(**) Rotate a list N places to the left.

Hint: Use the predefined functions length and (++).

rotate [] _ = []
rotate l 0 = l
rotate (x:xs) (n+1) = rotate (xs ++ [x]) n
rotate l n = rotate l (length l + n)

There are two separate cases:

  • If n > 0, move the first element to the end of the list n times.
  • If n < 0, convert the problem to the equivalent problem for n > 0 by adding the list's length to n.

or using cycle:

rotate xs n = take len . drop (n `mod` len) . cycle $ xs
    where len = length xs

or

rotate xs n = if n >= 0 then
                  drop n xs ++ take n xs
              else let l = ((length xs) + n) in
                  drop l xs ++ take l xs

or

rotate xs n = drop nn xs ++ take nn xs
    where 
      nn = n `mod` length xs

Using a simple splitAt trick

rotate xs n
    | n < 0 = rotate xs (n+len)
    | n > len = rotate xs (n-len)
    | otherwise = let (f,s) = splitAt n xs in s ++ f
    where len = length xs