import Data.List import Data.Tuple import Control.Arrow import Control.Monad main :: IO () main = zipWithM_ ((print .) . f) [3, 4, 6, 7] $ replicate 4 [1..10] f :: Int -> [a] -> [[a]] f = ((takeWhile (not . null) . uncurry (flip (++)) . first (: [])) .) . ((flip (mapAccumL ((swap .) . flip splitAt)) =<<)) . ((uncurry (++) . ((flip (replicate . fst) =<< (uncurry (+) . first signum)) &&& repeat . snd)).) . (swap .) . ((. length) . flip divMod)