main = do s <- getContents
putStr (unlines (reverse (rotate (lines s))))
rotate ls = if (maxLength ls) > 0 then (column ls) : (rotate (dropColumn ls))
else []
maxLength ls = (maximum (map length ls))
column ls = map wholeHead ls
dropColumn ls = map (drop 1) ls
wholeHead cs = if (null cs) then ' '
else (head cs)
Refactorings
No refactoring yet !
newacct
November 12, 2008, November 12, 2008 00:33, permalink
main = do s <- getContents
putStr $ unlines $ reverse $ rotate $ lines s
rotate ls | all null ls = []
| otherwise = column ls : rotate (dropColumn ls)
column ls = map wholeHead ls
dropColumn ls = map (drop 1) ls
wholeHead [] = ' '
wholeHead cs = head cs
Anders
March 13, 2009, March 13, 2009 02:01, permalink
Data.List has a function 'transpose' that does what you want, minus the space fill.
import Data.List (transpose) main = putStr . unlines . reverse . rotate . lines =<< getContents rotate xss = transpose $ spaceFill (maxLen xss) xss spaceFill n = map $ take n . (++ repeat ' ') maxLength = maximum . map length
Rotates text given in stdin 90 degrees.